sraivante commited on
Commit
76d666a
·
verified ·
1 Parent(s): 5268670

tiny-superfast-agentic-MLM-6.5m-v1: 6.44M-param NumPy command parser, sample executor, benchmarks

Browse files
LICENSE ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
NOTICE ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ tiny-superfast-agentic-MLM-6.5m-v1
2
+ Copyright (c) 2026 sraivante
3
+
4
+ Licensed under the Apache License, Version 2.0 (see LICENSE).
5
+
6
+ The model was trained from random initialisation (no pretrained base model) on a synthetic command dataset that is
7
+ not distributed with this repository.
8
+ The included executor is a sample for testing only and is not a fully developed product.
README.md ADDED
@@ -0,0 +1,322 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - en
5
+ - hi
6
+ pipeline_tag: text2text-generation
7
+ tags:
8
+ - function-calling
9
+ - tool-use
10
+ - agent
11
+ - intent-classification
12
+ - slot-filling
13
+ - seq2seq
14
+ - hinglish
15
+ - code-mixed
16
+ - voice-assistant
17
+ - raspberry-pi
18
+ - edge
19
+ - on-device
20
+ - cpu
21
+ - numpy
22
+ ---
23
+
24
+ # tiny-superfast-agentic-MLM-6.5m-v1: a 6.4M-parameter voice-command parser for laptops and Raspberry Pi
25
+
26
+ **tiny-superfast-agentic-MLM-6.5m-v1** turns one short spoken or typed command into a structured command that a
27
+ program can execute. It understands English and Hinglish (Roman-script Hindi-English), with some Devanagari Hindi, and covers **371 actions**
28
+ (audio, display, Wi-Fi, apps, files, timers, power, network, services, Raspberry Pi GPIO/I2C and more), and runs on
29
+ a plain CPU with **NumPy only**: no GPU, no PyTorch and no internet needed at inference.
30
+
31
+ ```text
32
+ ENGLISH "set the volume to 40" -> set_volume {"value": 40}
33
+ HINGLISH "volume 40 kar do" -> set_volume {"value": 40}
34
+ ENGLISH "connect to wifi Redmi Note 12 password hello@123" -> connect_wifi {"ssid": "Redmi Note 12", "password": "hello@123"}
35
+ HINGLISH "pwd Tiger@2025 daalo aur Hostel Wing C se jud jao" -> connect_wifi {"ssid": "Hostel Wing C", "password": "Tiger@2025"}
36
+ HINGLISH "10 min baad shutdown kar dena" -> shutdown {"amount": 10, "unit": "min"}
37
+ HINGLISH "board pin 11 pe led jalao" -> gpio_on {"pin": 11, "numbering": "board"}
38
+ HINDI "5 मिनट का टाइमर लगाओ" -> set_timer {"amount": 5, "unit": "min"}
39
+ ```
40
+
41
+ | | |
42
+ |---|---|
43
+ | Parameters | **6,441,472** (≈6.4M; "6.5m" in the name is rounded up) |
44
+ | Model file | `model/model.npz`, 23.9 MB, float32. `pytorch/model.pt` is included for fine-tuning |
45
+ | Runs on | CPU only, fully offline: Windows, Linux, Raspberry Pi 5. Inference needs only `numpy` |
46
+ | Accuracy | **97.53% exact** on 6,611 held-out-template commands (`test_strict`); **99.10%** on validation; 100% on 461 unseen Wi-Fi phrasings |
47
+ | Speed | median **18 ms** per command on a laptop i7-1360P, **30 ms** on a Raspberry Pi 5 (10 min sustained load) |
48
+ | Load time | 0.13 s (laptop), 0.20 s (Raspberry Pi 5) |
49
+ | Bigger sibling | [tiny-agentic-home-robotic-for-edge-device-v10](https://huggingface.co/sraivante/tiny-agentic-home-robotic-for-edge-device-v10) (23.9M params, MiniLM-based) |
50
+
51
+ > **About the name.** "MLM" here means *micro language model*. It is **not** a masked language model like BERT:
52
+ > the architecture is a small Transformer encoder-decoder (seq2seq) that writes the command one token at a time.
53
+
54
+ > **Executor notice.** The model only *parses* commands; it never runs anything. The executor in this repository is a
55
+ > **sample for testing, not a finished product**. It gates every action by risk (safe / caution / critical) and asks
56
+ > for confirmation before anything risky. Use it on a test machine and read the command before you run it.
57
+
58
+ ## Best use: a personal voice companion for small commands
59
+
60
+ The model is built to be the "understanding" step of a small, private, always-available assistant: you **speak** a
61
+ short command, and your computer or Raspberry Pi **does it**. It replaces a large LLM for common, well-defined device
62
+ commands, so the answer is instant (tens of milliseconds), private (nothing leaves the device) and free.
63
+
64
+ Attach any speech recognizer (ASR) in front of it and an executor behind it:
65
+
66
+ ```mermaid
67
+ flowchart LR
68
+ U(["User speaks<br/>'volume 40 kar do'"]) --> A["ASR<br/>speech → text<br/>(Whisper, Vosk, ...)"]
69
+ A -->|"text"| M["<b>tiny-superfast-agentic-MLM-6.5m-v1</b><br/>text → structured command<br/>6.4M params · ~20–70 ms on CPU"]
70
+ M -->|"set_volume {value: 40}<br/>+ confidence"| E["Executor<br/>validate → risk gate → OS command"]
71
+ E --> O(["Output action<br/>volume set to 40%"])
72
+ E -. "clarify / unknown /<br/>low confidence" .-> U
73
+ ```
74
+
75
+ If your viewer does not render Mermaid:
76
+
77
+ ```text
78
+ user voice ==> [ ASR ] --text--> [ tiny-superfast-agentic-MLM-6.5m-v1 ] --command JSON--> [ executor ] ==> output action
79
+ |
80
+ ask the user again <---- clarify / unknown / low confidence
81
+ ```
82
+
83
+ | Stage | What it does | Example |
84
+ |---|---|---|
85
+ | **1. ASR** (you bring it) | Turns speech into text. Any engine works: Whisper / faster-whisper, Vosk, a phone keyboard, or a chat box. | audio → `volume 40 kar do` |
86
+ | **2. This model** | Turns text into one action from the 371-action catalog, plus its typed arguments and a confidence score. | → `{"action": "set_volume", "value": 40}`, confidence 0.997 |
87
+ | **3. Executor** (sample included) | Checks the arguments, applies the risk gate, renders a whitelisted OS command for Windows or Raspberry Pi, and runs it or asks first. | → Pi: `wpctl set-volume @DEFAULT_AUDIO_SINK@ 40%` |
88
+ | **4. Output action** | The device acts, and the result can be read back to the user (TTS). | volume is now 40% |
89
+
90
+ A good agent pattern: execute only when confidence is high and the risk gate allows it, ask the user when the result
91
+ is `clarify`, and hand `unknown` or low-confidence text to a bigger model or back to the user.
92
+
93
+ ### Minimal voice loop (example)
94
+
95
+ ```python
96
+ # pip install numpy faster-whisper (ASR is your choice; this is one option)
97
+ import os; os.environ.setdefault("OPENBLAS_NUM_THREADS", "4") # "2" on a Raspberry Pi 5, see Speed
98
+ import sys; sys.path[:0] = ["model", "executor"]
99
+ from runtime import CommandModel
100
+ import executor as EX
101
+ from faster_whisper import WhisperModel
102
+
103
+ asr = WhisperModel("small", device="cpu", compute_type="int8")
104
+ parser = CommandModel("model")
105
+
106
+ def handle(wav_path):
107
+ text = " ".join(s.text for s in asr.transcribe(wav_path)[0]).strip() # 1. speech -> text
108
+ out = parser.predict(text); meta = out.pop("_meta") # 2. text -> command
109
+ plan = EX.plan(out, None, text) # 3. command -> gated OS command
110
+ if plan.action == "clarify" or meta["confidence"] < 0.8:
111
+ return f"Sorry, can you say that again? ({plan.note or text})"
112
+ ok, why = EX.gate(plan, allow_caution=False) # safe actions only in this demo
113
+ return EX.run(plan, out, dry_run=not ok) # 4. act (dry run if gated)
114
+ ```
115
+
116
+ The ASR part of this snippet is an illustration. The model was trained on typed/synthetic text, not on real ASR
117
+ transcripts, so test it with your own ASR output (see Limitations).
118
+
119
+ ## What it understands
120
+
121
+ Every example is shown in ENGLISH, then the same command in HINGLISH. The outputs, confidences and executor plans are
122
+ real outputs of this model and the included sample executor.
123
+
124
+ | Use case | Language | Command | Model output | Confidence | Risk | Raspberry Pi command |
125
+ |---|---|---|---|---|---|---|
126
+ | Audio | ENGLISH | `set the volume to 40` | `set_volume {"value": 40}` | 0.996 | safe | `wpctl set-volume … 40%` |
127
+ | Audio | HINGLISH | `volume 40 kar do` | `set_volume {"value": 40}` | 0.997 | safe | `wpctl set-volume … 40%` |
128
+ | Wi-Fi | ENGLISH | `connect to wifi Redmi Note 12 password hello@123` | `connect_wifi {"ssid": "Redmi Note 12", "password": "hello@123"}` | 1.000 | caution | `nmcli dev wifi connect 'Redmi Note 12' password hello@123` |
129
+ | Wi-Fi | HINGLISH | `Redmi Note 12 wifi se connect karo password hello@123` | same | 1.000 | caution | same |
130
+ | Wi-Fi, password first | ENGLISH | `password Tiger@2025 then join Hostel Wing C` | `connect_wifi {"ssid": "Hostel Wing C", "password": "Tiger@2025"}` | 1.000 | caution | `nmcli dev wifi connect 'Hostel Wing C' …` |
131
+ | Wi-Fi, password first | HINGLISH | `pwd Tiger@2025 daalo aur Hostel Wing C se jud jao` | same | 1.000 | caution | same |
132
+ | Apps | ENGLISH | `open chrome` | `open_app {"app": "chrome"}` | 0.990 | caution | `chromium-browser &` |
133
+ | Apps | HINGLISH | `chrome kholo` | `open_app {"app": "chrome"}` | 0.986 | caution | `chromium-browser &` |
134
+ | Timers | ENGLISH | `set a timer for 5 minutes` | `set_timer {"amount": 5, "unit": "min"}` | 0.998 | safe | built-in timer |
135
+ | Timers | HINGLISH | `5 minute ka timer lagao` | `set_timer {"amount": 5, "unit": "min"}` | 0.998 | safe | built-in timer |
136
+ | Power | ENGLISH | `shut down in 10 minutes` | `shutdown {"amount": 10, "unit": "min"}` | 0.998 | critical | `sudo shutdown -h +10` |
137
+ | Power | HINGLISH | `10 min baad shutdown kar dena` | `shutdown {"amount": 10, "unit": "min"}` | 0.998 | critical | `sudo shutdown -h +10` |
138
+ | Negation | ENGLISH | `don't shut down the laptop` | `cancel_shutdown {}` | 0.995 | caution | `shutdown -c` |
139
+ | Negation | HINGLISH | `shutdown mat karo` | `cancel_shutdown {}` | 0.995 | caution | `shutdown -c` |
140
+ | Pi GPIO | ENGLISH | `turn on board pin 11` | `gpio_on {"pin": 11, "numbering": "board"}` | 0.999 | critical | `sudo pinctrl set 17 op dh` |
141
+ | Pi GPIO | HINGLISH | `board pin 11 pe led jalao` | `gpio_on {"pin": 11, "numbering": "board"}` | 0.998 | critical | `sudo pinctrl set 17 op dh` |
142
+ | Pi GPIO, ambiguous pin | HINGLISH | `pin no 11 high karo` | `gpio_on {"pin": 11}` | 0.993 | → clarify | executor asks: *board pin 11 (= GPIO 17) or GPIO 11 (= board pin 23)?* |
143
+ | Diagnostics | ENGLISH | `what is the cpu temperature` | `get_temperature {}` | 0.995 | safe | `vcgencmd measure_temp` |
144
+ | Diagnostics | HINGLISH | `cpu ka temperature batao` | `get_temperature {}` | 0.996 | safe | `vcgencmd measure_temp` |
145
+ | Files | HINGLISH | `reports naam ka folder banao` | `create_folder {"path": "reports"}` | 0.999 | caution | `mkdir -p -- reports` |
146
+ | Out of scope | ENGLISH | `tell me a joke` | `unknown {}` | 0.993 | safe | nothing |
147
+ | Out of scope (miss) | HINGLISH | `kya haal hai bhai` | `recent_files {}` | **0.604** | safe | (low confidence: ask or hand off) |
148
+
149
+ The last row is a real miss: small talk went to a harmless action, but with low confidence. This is why the agent
150
+ should check the confidence before acting.
151
+
152
+ ## Test results
153
+
154
+ ### Accuracy
155
+
156
+ Held-out evaluation after training (raw model output, before the runtime "snap" repair). "Exact" means the action
157
+ and every argument match; "Action" means only the action matches.
158
+
159
+ | Set | n | Exact | Action | What it tests |
160
+ |---|---|---|---|---|
161
+ | validation | 10,413 | 99.10% | 99.29% | same templates as training, unseen rows |
162
+ | test | 10,618 | 98.37% | 98.52% | held-out templates |
163
+ | **test_strict** | **6,611** | **97.53%** | **97.70%** | held-out templates with no paraphrase sibling in training (the honest generalisation number) |
164
+ | curated | 371 | 99.46% | 99.73% | one held-out prompt per action |
165
+ | B_typo | 3,000 | 99.17% | 99.50% | typos |
166
+ | wifi_holdout | 461 | 100.00% | 100.00% | unseen Wi-Fi connect phrasings |
167
+ | gap11_holdout | 696 | 99.28% | 100.00% | unseen templates: password-first Wi-Fi, CPU clock vs usage, board↔BCM pins, fan vs mouse speed |
168
+ | A_challenge | 1,152 | 97.40% | 98.44% | external challenge set |
169
+ | B_golden_final | 384 | 97.40% | 97.40% | external golden set, including out-of-scope prompts |
170
+ | B_golden_dev | 383 | 95.04% | 95.82% | external golden set |
171
+ | A_practical-dev | 1,321 | 95.31% | 96.44% | external practical set |
172
+ | A_practical-holdout | 428 | 92.06% | 94.16% | external practical set; some misses are label-convention differences |
173
+
174
+ The same model was also run on the laptop and on the Raspberry Pi 5 (2,340 prompts, with the runtime snap). **Both
175
+ devices produce identical predictions: 97.82% exact, 98.46% action.**
176
+
177
+ ### Speed and temperature
178
+
179
+ 10 minutes of continuous single-stream inference on each device. Full per-pass and per-minute tables are in
180
+ [`eval/BENCHMARK.md`](eval/BENCHMARK.md).
181
+
182
+ | | Laptop (Intel i7-1360P) | Raspberry Pi 5 (16 GB) |
183
+ |---|---|---|
184
+ | Latency p50 / p95 / p99 | 18.4 / 168.6 / 239.6 ms | 30.2 / 243.9 / 281.6 ms |
185
+ | Throughput, cool → after 10 min | 29.6 → 18.5 commands/s | 13.9 → 13.9 commands/s |
186
+ | Temperature idle → peak | 52.6 → 91.9 °C | 38.5 → 59.8 °C |
187
+ | Throttling | slows down ~39% once hot | none (2400 MHz throughout, `get_throttled=0x0`) |
188
+ | Best BLAS threads | 4 | 2 |
189
+
190
+ - Latency grows with the length of the command the model writes: short commands take ~10–35 ms, Wi-Fi commands with
191
+ an SSID and a password take ~100–250 ms.
192
+ - **Set the BLAS thread count.** The matrices are small, so NumPy's default (one thread per core) is up to 4x slower.
193
+ Use `OPENBLAS_NUM_THREADS=4` on x86 laptops and `OPENBLAS_NUM_THREADS=2` on the Raspberry Pi 5 (`quickstart.py`
194
+ does this for you).
195
+
196
+ ### Test devices
197
+
198
+ | | Laptop | Raspberry Pi 5 |
199
+ |---|---|---|
200
+ | CPU | Intel Core i7-1360P (4P + 8E cores) | Broadcom BCM2712, 4× Cortex-A76 @ 2.4 GHz |
201
+ | RAM | 32 GB | 16 GB |
202
+ | OS | Windows 11 | Raspberry Pi OS (Debian 13), kernel 6.12 |
203
+ | Python / NumPy | 3.13 / 2.5.3 | 3.13 / 2.2.4 |
204
+ | Cooling | built-in fan, AC power | active cooler (PWM fan) |
205
+
206
+ ## Download and test
207
+
208
+ ### 1. Get the files
209
+
210
+ ```bash
211
+ pip install -U huggingface_hub
212
+ hf download sraivante/tiny-superfast-agentic-MLM-6.5m-v1 --local-dir tiny-agentic-6.5m
213
+ cd tiny-agentic-6.5m
214
+ ```
215
+
216
+ ### 2. Parse commands (nothing is executed)
217
+
218
+ ```bash
219
+ pip install numpy
220
+ python quickstart.py "volume 40 kar do" "connect to wifi Redmi Note 12 password hello@123"
221
+ python quickstart.py # interactive
222
+ ```
223
+
224
+ Each line prints the command, the confidence, the latency, the risk level and the OS command the sample executor
225
+ *would* run on this machine.
226
+
227
+ ### 3. Test UI and checks (Python 3.9+)
228
+
229
+ | | Windows | Raspberry Pi / Linux |
230
+ |---|---|---|
231
+ | Test UI in the browser (http://localhost:8000) | `run.bat` | `./run.sh` |
232
+ | Terminal agent | `run.bat cli` | `./run.sh cli` |
233
+ | Smoke test (model + executor, nothing executed) | `run.bat test` / `run.bat test --full` | `./run.sh test` / `./run.sh test --full` |
234
+ | HTML report of all 371 actions | `run.bat report` | `./run.sh report` |
235
+
236
+ The first run creates `.venv` and installs `numpy`, `fastapi` and `uvicorn`. `report` really runs the *safe,
237
+ read-only* actions on your machine (for example reading the volume or the IP address) and dry-runs everything else.
238
+
239
+ In the UI, *Run all* is always a dry run. **Execute** on a row runs that one command: safe actions run directly,
240
+ caution actions need the "allow caution" box, and critical actions ask you to type the action name. The UI listens on
241
+ 127.0.0.1 only and has no login, so do not expose it to a network.
242
+
243
+ ### 4. Reproduce the speed test
244
+
245
+ ```bash
246
+ cd eval
247
+ sh bench_run_all.sh python ../model <dir with eval .jsonl sets> <out_dir> default 1 2 4
248
+ ```
249
+
250
+ ## How the model works
251
+
252
+ - **Input:** one command, up to 128 characters, normalised and encoded character by character (200-symbol
253
+ vocabulary), so typos, code-mixing and odd spellings are handled without a word tokenizer.
254
+ - **Network:** Transformer encoder-decoder, d_model 256, 8 heads, FFN 768, 5 encoder + 3 decoder layers (pre-LN).
255
+ - **Output:** a short canonical command such as `connect_wifi ssid="…" password="…"`, written token by token
256
+ (1,052-token output vocabulary).
257
+ - **Grammar-constrained decoding:** at every step only tokens that keep the output valid are allowed. The action must
258
+ come from the 371-action catalog, the slots must belong to that action, and text slots (SSIDs, passwords, file names,
259
+ apps) must be copied from the input. The model cannot invent an action or a password that you did not say.
260
+ - **Snap:** a small post-decode repair extends copied SSIDs and passwords to whole tokens and recovers the original
261
+ letter case from the input.
262
+ - **Training:** from random initialisation (no pretrained base), 1,230,162 synthetic English/Hinglish rows, 18 epochs
263
+ on one NVIDIA A100 (bf16, batch 1024, lr 3e-3), about 36 minutes.
264
+ - **Catalog metadata:** each action carries `risk` (safe/caution/critical), `needs_sudo` and `platforms`, so the
265
+ executor can decide what to run, confirm or refuse.
266
+
267
+ ## Safety
268
+
269
+ - The model does not refuse anything. The **executor is the policy**: whitelisted command templates, per-shell
270
+ quoting, a risk gate and clarification questions.
271
+ - **Credential guard:** if a parsed Wi-Fi password or network name looks like a slip (a filler word such as "hai" or
272
+ "pehle", the password equal to the SSID, the password inside the SSID), the executor asks again instead of
273
+ connecting.
274
+ - **Bare pin numbers:** "pin no 11" can mean physical pin 11 or GPIO 11. For any action that drives a pin, the
275
+ executor asks which one unless the user said gpio, bcm, board, physical or header. Power and ground header pins are
276
+ always refused.
277
+ - Critical actions (shutdown, GPIO writes, `run_command`, ...) need the action name typed as confirmation.
278
+
279
+ ## Limitations
280
+
281
+ - Training data is synthetic, with no real ASR transcripts. Test with your own speech recognizer, and expect lower
282
+ accuracy on noisy transcripts.
283
+ - English and Roman-script Hinglish dominate the training data. Devanagari Hindi is only 0.26% of it (3,232 rows).
284
+ Spot checks work (`क्रोम खोलो` → `open_app chrome`, `वाईफाई बंद करो` → `wifi_off`, `5 मिनट का टाइमर लगाओ` → `set_timer`),
285
+ but there is no Devanagari test set, so its accuracy is not measured.
286
+ - One command per utterance. It is a parser, not a multi-step planner.
287
+ - Small talk and out-of-scope requests usually come back as `unknown`, but not always (see `kya haal hai bhai`
288
+ above). Use the confidence score.
289
+ - Known confusions: `scan_lan` vs `discover_devices` (a labelling ambiguity), and bare GPIO pin numbers (handled by
290
+ the executor, see Safety).
291
+ - The sample executor is not a finished product. Some Windows actions have no command-line equivalent and only open
292
+ the right Settings page. Many Raspberry Pi actions need tools such as `pinctrl`, `nmcli` or `i2c-tools`.
293
+
294
+ ## Files
295
+
296
+ | Path | What it is |
297
+ |---|---|
298
+ | `model/model.npz`, `model/config.json` | The model weights (NumPy) and architecture |
299
+ | `model/runtime.py`, `tokenizer.py`, `grammar.py`, `normalize.py`, `snap.py`, `catalog.py` | NumPy inference code |
300
+ | `model/catalog.json` | The 371 actions with slots, risk, sudo and platform metadata |
301
+ | `pytorch/model.pt`, `pytorch/model.py` | PyTorch checkpoint (`{"state", "cfg"}`) and model definition, for fine-tuning |
302
+ | `quickstart.py` | Command-line demo (parse + show plan, nothing executed) |
303
+ | `executor/` | Sample executor: Windows and Raspberry Pi command templates, risk gate, credential and pin guards |
304
+ | `ui/`, `run.sh`, `run.bat` | Local test UI and terminal agent |
305
+ | `eval/` | Smoke test, curated and Wi-Fi evaluation prompts, HTML report generator, benchmark script and results |
306
+ | `tools/install_model.py` | Swap in a re-trained `model.npz` (backs up the current one) |
307
+
308
+ Load the PyTorch checkpoint:
309
+
310
+ ```python
311
+ import torch; from pytorch.model import Seq2Seq
312
+ ck = torch.load("pytorch/model.pt", map_location="cpu"); c = ck["cfg"]
313
+ m = Seq2Seq(c["n_in"], c["n_out"], d=c["d"], h=c["h"], f=c["f"], n_enc=c["n_enc"], n_dec=c["n_dec"],
314
+ max_in=c["max_in"], max_out=c["max_out"])
315
+ m.load_state_dict(ck["state"]) # 6,441,472 parameters
316
+ ```
317
+
318
+ ## License and credits
319
+
320
+ Code and model weights: Apache-2.0, Copyright (c) 2026 sraivante. Trained from scratch; no pretrained weights are
321
+ used. The training dataset is synthetic and is not published. Provided as-is, without warranty. You are responsible
322
+ for anything you let an executor do.
eval/BENCHMARK.md ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## On-device performance: speed, temperature and accuracy
2
+
3
+ Model: Union command parser, 6.44M params (d=256, 5 encoder + 3 decoder layers, 8 heads), character-level
4
+ encoder-decoder with grammar-constrained decoding over 371 actions. Weights: `model.npz` (23.9 MB, float32).
5
+ Inference: pure NumPy on CPU, one prompt at a time, greedy decoding. Measured 2026-09-27.
6
+
7
+ ### Summary
8
+
9
+ | | Laptop (Intel i7-1360P) | Raspberry Pi 5 (16 GB) |
10
+ |---|---|---|
11
+ | Accuracy, exact (2,340 prompts) | **97.82%** | **97.82%** |
12
+ | Accuracy, action only | 98.46% | 98.46% |
13
+ | Model load time | 0.13 s | 0.20 s |
14
+ | Latency p50 / p95 / p99 (10 min sustained) | 18.4 / 168.6 / 239.6 ms | 30.2 / 243.9 / 281.6 ms |
15
+ | Mean latency (10 min sustained) | 45.8 ms | 72.0 ms |
16
+ | Throughput, first pass (cool) | 29.6 prompts/s | 13.9 prompts/s |
17
+ | Throughput, last 5 minutes (hot) | 18.5 prompts/s | 13.9 prompts/s |
18
+ | Temperature idle → peak | 52.6 → 91.9 °C | 38.5 → 59.8 °C |
19
+ | Thermal throttling | slowed down by ~39% once hot (see below) | none (`get_throttled=0x0`, 2400 MHz throughout) |
20
+ | Best BLAS thread setting | 4 threads | 2 threads |
21
+
22
+ - **Accuracy is identical on both devices.** The same predictions come out on x86-64 and on ARM64.
23
+ - **The Pi 5 holds its speed.** Its latency did not change across 10 minutes of continuous load. With the active
24
+ cooler, the SoC stayed below 60 °C and the fan never went above state 2.
25
+ - **The laptop is about 2.1x faster than the Pi when cool, but only about 1.3x faster once hot.** After it reached
26
+ 88–92 °C, its throughput fell from ~30 to ~18 prompts/s.
27
+
28
+ ### Accuracy per evaluation set
29
+
30
+ The numbers come from the runtime, so they include the post-decode "snap" repair. They are the same on both devices.
31
+
32
+ | Set | n | Exact | Action | What it tests |
33
+ |---|---|---|---|---|
34
+ | curated | 371 | 99.46% | 99.73% | one held-out prompt per action (all 371 actions) |
35
+ | wifi_holdout | 461 | 100.00% | 100.00% | unseen Wi-Fi connect phrasings (SSID/password extraction) |
36
+ | gap11_holdout | 696 | 99.28% | 100.00% | unseen templates: password-first Wi-Fi, CPU clock vs usage, board↔BCM pins, fan vs mouse speed |
37
+ | B_golden_final | 384 | 97.40% | 97.40% | external golden set, including out-of-scope prompts (`unknown`) |
38
+ | A_practical-holdout | 428 | 92.06% | 94.16% | external practical set; some misses are label-convention differences |
39
+ | **All** | **2,340** | **97.82%** | **98.46%** | |
40
+
41
+ "Exact" means the action and every slot value match. "Action" means only the action label matches.
42
+
43
+ ### Speed vs temperature under sustained load
44
+
45
+ Each device ran the same 2,340 prompts in a fixed shuffled order (seed 0), repeated for 10 minutes. Every pass is the
46
+ same workload, so any change between passes comes from the device, not from the prompts.
47
+
48
+ **Laptop, Intel Core i7-1360P** (Windows 11, on AC power, Balanced power plan, 4 BLAS threads)
49
+
50
+ | Pass | Temp (°C) min–max | Avg clock (MHz) | Mean (ms) | p50 (ms) | p95 (ms) | Prompts/s |
51
+ |---|---|---|---|---|---|---|
52
+ | 1 | 51.9 – 90.9 | 3067 | 33.8 | 14.6 | 111.0 | 29.6 |
53
+ | 2 | 83.9 – 91.9 | 2838 | 37.5 | 15.6 | 121.4 | 26.7 |
54
+ | 3 | 81.9 – 91.9 | 2872 | 42.4 | 17.0 | 150.4 | 23.6 |
55
+ | 4 | 81.9 – 89.9 | 2853 | 55.8 | 22.5 | 202.0 | 17.9 |
56
+ | 5 | 81.9 – 86.9 | 2959 | 55.2 | 22.7 | 196.2 | 18.1 |
57
+ | 6 (partial, 1,411) | 79.9 – 82.9 | 2954 | 52.5 | 21.3 | 184.8 | 19.0 |
58
+
59
+ **Raspberry Pi 5, 16 GB** (Raspberry Pi OS, kernel 6.12, `ondemand` governor, active cooler (PWM fan), 2 BLAS threads)
60
+
61
+ | Pass | Temp (°C) min–max | Clock (MHz) | Mean (ms) | p50 (ms) | p95 (ms) | Prompts/s | Throttled |
62
+ |---|---|---|---|---|---|---|---|
63
+ | 1 | 41.1 – 57.6 | 2400 | 72.2 | 30.4 | 244.5 | 13.86 | 0x0 |
64
+ | 2 | 57.1 – 59.8 | 2400 | 72.0 | 30.2 | 243.9 | 13.90 | 0x0 |
65
+ | 3 | 56.5 – 59.3 | 2400 | 71.9 | 29.9 | 243.8 | 13.91 | 0x0 |
66
+ | 4 (partial, 1,314) | 56.5 – 58.7 | 2400 | 71.9 | 30.5 | 242.5 | 13.90 | 0x0 |
67
+
68
+ <details>
69
+ <summary>Per-minute view</summary>
70
+
71
+ | Minute | Laptop °C | Laptop MHz | Laptop mean ms | Laptop prompts/s | Pi °C | Pi MHz | Pi mean ms | Pi prompts/s | Pi fan state |
72
+ |---|---|---|---|---|---|---|---|---|---|
73
+ | 1 | 88.9 | 3145 | 33.2 | 30.1 | 54.9 | 2400 | 72.2 | 13.9 | 1 |
74
+ | 2 | 91.9 | 3094 | 34.4 | 29.1 | 57.6 | 2400 | 74.5 | 13.4 | 1 |
75
+ | 3 | 91.9 | 2745 | 39.2 | 25.5 | 57.6 | 2400 | 68.9 | 14.5 | 1 |
76
+ | 4 | 91.9 | 2819 | 39.9 | 25.0 | 58.7 | 2400 | 73.5 | 13.6 | 1 |
77
+ | 5 | 88.9 | 2703 | 61.8 | 16.2 | 59.8 | 2400 | 72.4 | 13.8 | 1 |
78
+ | 6 | 89.9 | 2966 | 56.3 | 17.7 | 59.8 | 2400 | 70.5 | 14.2 | 1→2 |
79
+ | 7 | 84.9 | 2936 | 52.0 | 19.3 | 58.2 | 2400 | 71.5 | 14.0 | 2 |
80
+ | 8 | 86.9 | 2815 | 59.7 | 16.8 | 58.2 | 2400 | 72.5 | 13.8 | 2 |
81
+ | 9 | 84.9 | 2982 | 49.5 | 20.3 | 58.2 | 2400 | 71.7 | 14.0 | 2 |
82
+ | 10 | 81.9 | 2969 | 53.5 | 18.7 | 58.7 | 2400 | 72.5 | 13.8 | 2 |
83
+
84
+ </details>
85
+
86
+ About the laptop slowdown: from pass 1 to pass 5, throughput fell by 39% and mean latency rose by 63%, but the
87
+ Windows all-core frequency counter fell by only 3–10%. So the clock drop alone does not explain the slowdown. The
88
+ likely causes are the package power limit and the scheduler moving work between P-cores and E-cores. This counter
89
+ cannot tell those apart.
90
+
91
+ ### Latency depends on output length
92
+
93
+ The model decodes one token at a time, so latency grows with the length of the command it writes. Short commands
94
+ (`volume_up`, `set_volume value=50`) finish in about 10–20 ms on the laptop and 20–35 ms on the Pi 5. Commands with long text slots (`connect_wifi ssid=…
95
+ password=…`, web searches, file paths) make up the p95/p99 tail: about 110–200 ms on the laptop and about 245 ms on
96
+ the Pi 5.
97
+
98
+ ### BLAS threads matter more than core count
99
+
100
+ We ran 300 mixed prompts per setting, with `OPENBLAS_NUM_THREADS` and `OMP_NUM_THREADS` set before NumPy loads.
101
+
102
+ | Threads | Laptop mean / p95 (ms) | Pi 5 mean / p95 (ms) |
103
+ |---|---|---|
104
+ | NumPy default (all cores) | 130.1 / 519.9 | 82.0 / 286.1 |
105
+ | 1 | 32.6 / 113.0 | 82.3 / 295.2 |
106
+ | 2 | 31.6 / 108.2 | **66.2 / 232.6** |
107
+ | 4 | **30.7 / 99.6** | 81.2 / 280.5 |
108
+
109
+ The matrices in this model are small. With OpenBLAS's default setting of one thread per core (16 on the laptop),
110
+ thread synchronisation costs more than the arithmetic, which makes the laptop about 4x slower. **Set
111
+ `OPENBLAS_NUM_THREADS=4` on x86 laptops and `OPENBLAS_NUM_THREADS=2` on the Raspberry Pi 5.**
112
+
113
+ ### Test setup
114
+
115
+ | | Laptop | Raspberry Pi 5 |
116
+ |---|---|---|
117
+ | CPU | Intel Core i7-1360P (4P + 8E cores, 16 threads) | Broadcom BCM2712, 4× Cortex-A76 @ 2.4 GHz |
118
+ | RAM | 32 GB | 16 GB |
119
+ | OS | Windows 11 (build 26200) | Raspberry Pi OS (Debian 13), kernel 6.12.47 |
120
+ | Python / NumPy | 3.13.14 / 2.5.3 (OpenBLAS 0.3.34) | 3.13.5 / 2.2.4 |
121
+ | Cooling / power | built-in fan, AC power, Balanced plan | active cooler (PWM fan), `ondemand` governor |
122
+ | Temperature source | ACPI thermal zone (`\_TZ.TZ01`), **not** the CPU core sensor | SoC sensor (`vcgencmd measure_temp`) |
123
+ | Clock source | `% Processor Performance` × base frequency (all-core average) | `vcgencmd measure_clock arm` |
124
+
125
+ Method: a 30 s idle reading, 20 warm-up prompts, then 10 minutes of continuous single-stream inference. Temperature,
126
+ clock, throttle flags and fan state were sampled every 10 s. Accuracy was measured on the first full pass. Both devices ran
127
+ at the same time, and nothing else heavy ran on either one (the laptop also ran the SSH session that drove the Pi).
128
+
129
+ ### Reproduce
130
+
131
+ ```bash
132
+ # from the agent folder; <data> holds curated / wifi_holdout / gap11_holdout / B_golden_final / A_practical-holdout .jsonl
133
+ cd eval
134
+ sh bench_run_all.sh python ../model <data> <out_dir> default 1 2 4 # thread probe, picks the fastest, 2 min cooldown, 10 min run
135
+ ```
136
+
137
+ Raw results are in `eval/bench_results/` (`*_threads.json` = thread probe, the other files = full run with per-pass
138
+ and per-minute data).
eval/bench_device.py ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Device benchmark: latency vs temperature under sustained load, plus accuracy, for the numpy runtime.
2
+ python bench_device.py --model ../model --data <dir with *.jsonl eval sets> --out result.json [--threads-probe]
3
+ Phases: idle temperature (30 s) -> warm-up -> every prompt of every eval set once (sustained load; stats per 60 s
4
+ window: temperature, CPU clock, latency p50/p95, prompts/s) -> optional 1-thread vs default-thread probe.
5
+ Accuracy = runtime output (with snap) == target, i.e. what `run.sh test --full` measures, not the raw Colab number.
6
+ Temperature: Raspberry Pi = SoC sensor (vcgencmd); Windows = ACPI thermal zone (not the CPU core sensor).
7
+ """
8
+ import argparse, json, os, platform, statistics, subprocess, sys, threading, time
9
+
10
+ SETS = ["curated", "wifi_holdout", "gap11_holdout", "B_golden_final", "A_practical-holdout"]
11
+
12
+ def is_pi(): return os.path.exists("/usr/bin/vcgencmd")
13
+ PS = os.path.join(os.environ.get("SystemRoot", r"C:\Windows"), "System32", "WindowsPowerShell", "v1.0", "powershell.exe")
14
+
15
+ def sample():
16
+ """-> dict(temp_c, clock_mhz, throttled) for this device; missing values are None."""
17
+ if is_pi():
18
+ def v(*a): return subprocess.run(["vcgencmd", *a], capture_output=True, text=True).stdout.strip()
19
+ t = float(v("measure_temp").split("=")[1].rstrip("'C")); f = int(v("measure_clock", "arm").split("=")[1]) / 1e6
20
+ fan = open("/sys/class/thermal/cooling_device0/cur_state").read().strip() if os.path.exists("/sys/class/thermal/cooling_device0/cur_state") else None
21
+ return {"temp_c": t, "clock_mhz": round(f), "throttled": v("get_throttled").split("=")[1], "fan_state": fan}
22
+ if os.name == "nt":
23
+ ps = ("$c=Get-Counter '\\Thermal Zone Information(*)\\Temperature','\\Processor Information(_Total)\\% Processor Performance','\\Processor Information(_Total)\\Processor Frequency';"
24
+ "$c.CounterSamples | ForEach-Object { $_.Path + '=' + $_.CookedValue }")
25
+ out = subprocess.run([PS, "-NoProfile", "-Command", ps], capture_output=True, text=True).stdout
26
+ temps, perf, freq = [], None, None
27
+ for line in out.splitlines():
28
+ k, _, val = line.rpartition("=")
29
+ if not val: continue
30
+ if "temperature" in k.lower(): temps.append(float(val) - 273.15)
31
+ elif "% processor performance" in k.lower(): perf = float(val)
32
+ elif "processor frequency" in k.lower(): freq = float(val)
33
+ clock = round(freq * perf / 100) if freq and perf else None
34
+ return {"temp_c": round(max(temps), 1) if temps else None, "clock_mhz": clock, "throttled": None, "fan_state": None}
35
+ return {"temp_c": None, "clock_mhz": None, "throttled": None, "fan_state": None}
36
+
37
+ class Sampler(threading.Thread):
38
+ def __init__(self, every=10):
39
+ super().__init__(daemon=True); self.every, self.rows, self.stop = every, [], False
40
+ def run(self):
41
+ while not self.stop:
42
+ s = sample(); s["t"] = time.time(); self.rows.append(s); time.sleep(self.every)
43
+
44
+ def pct(xs, p):
45
+ xs = sorted(xs); return xs[min(len(xs) - 1, int(round(p / 100 * (len(xs) - 1))))]
46
+
47
+ def device_info():
48
+ info = {"platform": platform.platform(), "python": platform.python_version(), "machine": platform.machine()}
49
+ import numpy; info["numpy"] = numpy.__version__
50
+ if is_pi():
51
+ info["model"] = open("/proc/device-tree/model").read().strip("\x00 \n"); info["cores"] = os.cpu_count()
52
+ info["governor"] = open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor").read().strip()
53
+ elif os.name == "nt":
54
+ out = subprocess.run([PS, "-NoProfile", "-Command", "(Get-CimInstance Win32_Processor).Name"], capture_output=True, text=True).stdout.strip()
55
+ info["model"] = out; info["cores"] = os.cpu_count()
56
+ return info
57
+
58
+ def load_sets(data):
59
+ rows = []
60
+ for s in SETS:
61
+ p = os.path.join(data, s + ".jsonl")
62
+ if os.path.exists(p): rows += [(s, json.loads(l)) for l in open(p, encoding="utf-8")]
63
+ return rows
64
+
65
+ def main():
66
+ ap = argparse.ArgumentParser(); ap.add_argument("--model", required=True); ap.add_argument("--data", required=True); ap.add_argument("--out", required=True)
67
+ ap.add_argument("--idle", type=int, default=30); ap.add_argument("--window", type=int, default=60)
68
+ ap.add_argument("--probe-only", action="store_true"); ap.add_argument("--probe-n", type=int, default=200)
69
+ ap.add_argument("--minutes", type=float, default=10, help="sustained-load duration (one full pass of all sets at minimum)")
70
+ a = ap.parse_args()
71
+ sys.path.insert(0, os.path.abspath(a.model)); from runtime import CommandModel
72
+ t0 = time.time(); m = CommandModel(os.path.abspath(a.model)); load_s = time.time() - t0
73
+ rows = load_sets(a.data)
74
+ import random; random.Random(0).shuffle(rows) # same mixed order everywhere, so every window/pass has the same workload
75
+ if a.probe_only: # one process per thread setting: env vars must be set before numpy loads
76
+ lat = []
77
+ for _, r in rows[:20]: m.predict_raw(r["text"])
78
+ for _, r in rows[:a.probe_n]:
79
+ t = time.perf_counter(); m.predict_raw(r["text"]); lat.append((time.perf_counter() - t) * 1000)
80
+ json.dump({"n": len(lat), "p50_ms": round(pct(lat, 50), 1), "p95_ms": round(pct(lat, 95), 1), "mean_ms": round(statistics.mean(lat), 1)}, open(a.out, "w")); return
81
+ res = {"device": device_info(), "model_load_s": round(load_s, 2), "params": int(sum(v.size for v in m.W.values()))}
82
+ print(res["device"], "load", res["model_load_s"], "s", flush=True)
83
+ idle = [sample() for _ in range(max(1, a.idle // 5)) if not time.sleep(5)]
84
+ res["idle"] = {"temp_c": round(statistics.mean(s["temp_c"] for s in idle), 1) if idle[0]["temp_c"] is not None else None, "clock_mhz": idle[-1]["clock_mhz"]}
85
+ print("idle", res["idle"], flush=True)
86
+ for _, r in rows[:20]: m.predict_raw(r["text"]) # warm-up
87
+ smp = Sampler(10); smp.start(); t_start = time.time(); recs = []; i = 0
88
+ while i < len(rows) or time.time() - t_start < a.minutes * 60: # at least one full pass, then loop until --minutes
89
+ s, r = rows[i % len(rows)]
90
+ t = time.perf_counter(); pred = m.predict_raw(r["text"])[0]; ms = (time.perf_counter() - t) * 1000
91
+ recs.append({"set": s, "ok": pred == r["target"], "act_ok": pred.split()[0] == r["action"], "ms": ms, "t": time.time(), "first": i < len(rows), "pass": i // len(rows) + 1})
92
+ if i % 500 == 0: print(f" {i} {ms:.0f} ms {smp.rows[-1]['temp_c'] if smp.rows else ''} C {time.time()-t_start:.0f}s", flush=True)
93
+ i += 1
94
+ smp.stop = True; wall = time.time() - t_start
95
+ windows = []
96
+ for w in range(int(wall // a.window) + 1):
97
+ lo, hi = t_start + w * a.window, t_start + (w + 1) * a.window
98
+ rs = [x for x in recs if lo <= x["t"] < hi]; ss = [x for x in smp.rows if lo <= x["t"] < hi]
99
+ if len(rs) < 5: continue
100
+ temps = [x["temp_c"] for x in ss if x["temp_c"] is not None]; clk = [x["clock_mhz"] for x in ss if x["clock_mhz"]]
101
+ windows.append({"minute": w + 1, "n": len(rs), "temp_c": round(max(temps), 1) if temps else None, "clock_mhz": round(statistics.mean(clk)) if clk else None,
102
+ "mean_ms": round(statistics.mean(x["ms"] for x in rs), 1), "p50_ms": round(pct([x["ms"] for x in rs], 50), 1), "p95_ms": round(pct([x["ms"] for x in rs], 95), 1),
103
+ "prompts_per_s": round(len(rs) / min(a.window, hi - max(lo, recs[0]["t"])), 2),
104
+ "throttled": sorted({x["throttled"] for x in ss if x["throttled"]}), "fan_state": sorted({x["fan_state"] for x in ss if x["fan_state"]})})
105
+ lat = [x["ms"] for x in recs]
106
+ res["load"] = {"prompts": len(recs), "wall_s": round(wall, 1), "p50_ms": round(pct(lat, 50), 1), "p95_ms": round(pct(lat, 95), 1), "p99_ms": round(pct(lat, 99), 1),
107
+ "mean_ms": round(statistics.mean(lat), 1), "max_temp_c": max((w["temp_c"] for w in windows if w["temp_c"] is not None), default=None),
108
+ "throttled_any": sorted({f for x in smp.rows if x["throttled"] for f in [x["throttled"]]})}
109
+ res["windows"] = windows
110
+ passes = [] # identical workload per pass: the clean comparison of speed as the device heats up
111
+ for pn in sorted({x["pass"] for x in recs}):
112
+ rs = [x for x in recs if x["pass"] == pn]; lo, hi = rs[0]["t"], rs[-1]["t"]
113
+ ss = [x for x in smp.rows if lo - 10 <= x["t"] <= hi]; temps = [x["temp_c"] for x in ss if x["temp_c"] is not None]
114
+ clk = [x["clock_mhz"] for x in ss if x["clock_mhz"]]; ms = [x["ms"] for x in rs]
115
+ passes.append({"pass": pn, "n": len(rs), "complete": len(rs) == len(rows), "temp_min_c": min(temps) if temps else None, "temp_max_c": max(temps) if temps else None,
116
+ "clock_mhz": round(statistics.mean(clk)) if clk else None, "mean_ms": round(statistics.mean(ms), 1), "p50_ms": round(pct(ms, 50), 1),
117
+ "p95_ms": round(pct(ms, 95), 1), "prompts_per_s": round(len(rs) / max(hi - lo, 1e-9), 2)})
118
+ res["passes"] = passes
119
+ first =[x for x in recs if x["first"]]
120
+ res["accuracy"] = {s: {"n": sum(1 for x in first if x["set"] == s), "exact": round(100 * sum(x["ok"] for x in first if x["set"] == s) / max(1, sum(1 for x in first if x["set"] == s)), 2),
121
+ "action": round(100 * sum(x["act_ok"] for x in first if x["set"] == s) / max(1, sum(1 for x in first if x["set"] == s)), 2)} for s in SETS}
122
+ res["accuracy_all"] = {"n": len(first), "exact": round(100 * sum(x["ok"] for x in first) / len(first), 2), "action": round(100 * sum(x["act_ok"] for x in first) / len(first), 2)}
123
+ res["threads"] = {k: os.environ.get(k) for k in ("OPENBLAS_NUM_THREADS", "OMP_NUM_THREADS")}
124
+ json.dump(res, open(a.out, "w"), indent=1); print(json.dumps(res["load"]), flush=True)
125
+
126
+ if __name__ == "__main__": main()
eval/bench_results/laptop_i7-1360P.json ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "device": {
3
+ "platform": "Windows-11-10.0.26200-SP0",
4
+ "python": "3.13.14",
5
+ "machine": "AMD64",
6
+ "numpy": "2.5.3",
7
+ "model": "13th Gen Intel(R) Core(TM) i7-1360P",
8
+ "cores": 16
9
+ },
10
+ "model_load_s": 0.13,
11
+ "params": 6441472,
12
+ "idle": {
13
+ "temp_c": 52.6,
14
+ "clock_mhz": 976
15
+ },
16
+ "load": {
17
+ "prompts": 13111,
18
+ "wall_s": 600.0,
19
+ "p50_ms": 18.4,
20
+ "p95_ms": 168.6,
21
+ "p99_ms": 239.6,
22
+ "mean_ms": 45.8,
23
+ "max_temp_c": 91.9,
24
+ "throttled_any": []
25
+ },
26
+ "windows": [
27
+ {
28
+ "minute": 1,
29
+ "n": 1806,
30
+ "temp_c": 88.9,
31
+ "clock_mhz": 3145,
32
+ "mean_ms": 33.2,
33
+ "p50_ms": 14.6,
34
+ "p95_ms": 105.2,
35
+ "prompts_per_s": 30.11,
36
+ "throttled": [],
37
+ "fan_state": []
38
+ },
39
+ {
40
+ "minute": 2,
41
+ "n": 1745,
42
+ "temp_c": 91.9,
43
+ "clock_mhz": 3094,
44
+ "mean_ms": 34.4,
45
+ "p50_ms": 14.9,
46
+ "p95_ms": 113.7,
47
+ "prompts_per_s": 29.08,
48
+ "throttled": [],
49
+ "fan_state": []
50
+ },
51
+ {
52
+ "minute": 3,
53
+ "n": 1528,
54
+ "temp_c": 91.9,
55
+ "clock_mhz": 2745,
56
+ "mean_ms": 39.2,
57
+ "p50_ms": 15.8,
58
+ "p95_ms": 128.2,
59
+ "prompts_per_s": 25.47,
60
+ "throttled": [],
61
+ "fan_state": []
62
+ },
63
+ {
64
+ "minute": 4,
65
+ "n": 1501,
66
+ "temp_c": 91.9,
67
+ "clock_mhz": 2819,
68
+ "mean_ms": 39.9,
69
+ "p50_ms": 16.4,
70
+ "p95_ms": 133.5,
71
+ "prompts_per_s": 25.02,
72
+ "throttled": [],
73
+ "fan_state": []
74
+ },
75
+ {
76
+ "minute": 5,
77
+ "n": 971,
78
+ "temp_c": 88.9,
79
+ "clock_mhz": 2703,
80
+ "mean_ms": 61.8,
81
+ "p50_ms": 25.0,
82
+ "p95_ms": 235.3,
83
+ "prompts_per_s": 16.18,
84
+ "throttled": [],
85
+ "fan_state": []
86
+ },
87
+ {
88
+ "minute": 6,
89
+ "n": 1063,
90
+ "temp_c": 89.9,
91
+ "clock_mhz": 2966,
92
+ "mean_ms": 56.3,
93
+ "p50_ms": 22.9,
94
+ "p95_ms": 198.6,
95
+ "prompts_per_s": 17.72,
96
+ "throttled": [],
97
+ "fan_state": []
98
+ },
99
+ {
100
+ "minute": 7,
101
+ "n": 1155,
102
+ "temp_c": 84.9,
103
+ "clock_mhz": 2936,
104
+ "mean_ms": 52.0,
105
+ "p50_ms": 20.4,
106
+ "p95_ms": 193.2,
107
+ "prompts_per_s": 19.25,
108
+ "throttled": [],
109
+ "fan_state": []
110
+ },
111
+ {
112
+ "minute": 8,
113
+ "n": 1005,
114
+ "temp_c": 86.9,
115
+ "clock_mhz": 2815,
116
+ "mean_ms": 59.7,
117
+ "p50_ms": 24.3,
118
+ "p95_ms": 207.0,
119
+ "prompts_per_s": 16.75,
120
+ "throttled": [],
121
+ "fan_state": []
122
+ },
123
+ {
124
+ "minute": 9,
125
+ "n": 1215,
126
+ "temp_c": 84.9,
127
+ "clock_mhz": 2982,
128
+ "mean_ms": 49.5,
129
+ "p50_ms": 20.2,
130
+ "p95_ms": 175.5,
131
+ "prompts_per_s": 20.25,
132
+ "throttled": [],
133
+ "fan_state": []
134
+ },
135
+ {
136
+ "minute": 10,
137
+ "n": 1121,
138
+ "temp_c": 81.9,
139
+ "clock_mhz": 2969,
140
+ "mean_ms": 53.5,
141
+ "p50_ms": 21.9,
142
+ "p95_ms": 184.4,
143
+ "prompts_per_s": 18.68,
144
+ "throttled": [],
145
+ "fan_state": []
146
+ }
147
+ ],
148
+ "passes": [
149
+ {
150
+ "pass": 1,
151
+ "n": 2340,
152
+ "complete": true,
153
+ "temp_min_c": 51.9,
154
+ "temp_max_c": 90.9,
155
+ "clock_mhz": 3067,
156
+ "mean_ms": 33.8,
157
+ "p50_ms": 14.6,
158
+ "p95_ms": 111.0,
159
+ "prompts_per_s": 29.59
160
+ },
161
+ {
162
+ "pass": 2,
163
+ "n": 2340,
164
+ "complete": true,
165
+ "temp_min_c": 83.9,
166
+ "temp_max_c": 91.9,
167
+ "clock_mhz": 2838,
168
+ "mean_ms": 37.5,
169
+ "p50_ms": 15.6,
170
+ "p95_ms": 121.4,
171
+ "prompts_per_s": 26.67
172
+ },
173
+ {
174
+ "pass": 3,
175
+ "n": 2340,
176
+ "complete": true,
177
+ "temp_min_c": 81.9,
178
+ "temp_max_c": 91.9,
179
+ "clock_mhz": 2872,
180
+ "mean_ms": 42.4,
181
+ "p50_ms": 17.0,
182
+ "p95_ms": 150.4,
183
+ "prompts_per_s": 23.56
184
+ },
185
+ {
186
+ "pass": 4,
187
+ "n": 2340,
188
+ "complete": true,
189
+ "temp_min_c": 81.9,
190
+ "temp_max_c": 89.9,
191
+ "clock_mhz": 2853,
192
+ "mean_ms": 55.8,
193
+ "p50_ms": 22.5,
194
+ "p95_ms": 202.0,
195
+ "prompts_per_s": 17.93
196
+ },
197
+ {
198
+ "pass": 5,
199
+ "n": 2340,
200
+ "complete": true,
201
+ "temp_min_c": 81.9,
202
+ "temp_max_c": 86.9,
203
+ "clock_mhz": 2959,
204
+ "mean_ms": 55.2,
205
+ "p50_ms": 22.7,
206
+ "p95_ms": 196.2,
207
+ "prompts_per_s": 18.11
208
+ },
209
+ {
210
+ "pass": 6,
211
+ "n": 1411,
212
+ "complete": false,
213
+ "temp_min_c": 79.9,
214
+ "temp_max_c": 82.9,
215
+ "clock_mhz": 2954,
216
+ "mean_ms": 52.5,
217
+ "p50_ms": 21.3,
218
+ "p95_ms": 184.8,
219
+ "prompts_per_s": 19.04
220
+ }
221
+ ],
222
+ "accuracy": {
223
+ "curated": {
224
+ "n": 371,
225
+ "exact": 99.46,
226
+ "action": 99.73
227
+ },
228
+ "wifi_holdout": {
229
+ "n": 461,
230
+ "exact": 100.0,
231
+ "action": 100.0
232
+ },
233
+ "gap11_holdout": {
234
+ "n": 696,
235
+ "exact": 99.28,
236
+ "action": 100.0
237
+ },
238
+ "B_golden_final": {
239
+ "n": 384,
240
+ "exact": 97.4,
241
+ "action": 97.4
242
+ },
243
+ "A_practical-holdout": {
244
+ "n": 428,
245
+ "exact": 92.06,
246
+ "action": 94.16
247
+ }
248
+ },
249
+ "accuracy_all": {
250
+ "n": 2340,
251
+ "exact": 97.82,
252
+ "action": 98.46
253
+ },
254
+ "threads": {
255
+ "OPENBLAS_NUM_THREADS": "4",
256
+ "OMP_NUM_THREADS": "4"
257
+ }
258
+ }
eval/bench_results/laptop_i7-1360P_threads.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "default": {
3
+ "n": 300,
4
+ "p50_ms": 49.2,
5
+ "p95_ms": 519.9,
6
+ "mean_ms": 130.1
7
+ },
8
+ "1": {
9
+ "n": 300,
10
+ "p50_ms": 13.2,
11
+ "p95_ms": 113.0,
12
+ "mean_ms": 32.6
13
+ },
14
+ "2": {
15
+ "n": 300,
16
+ "p50_ms": 13.6,
17
+ "p95_ms": 108.2,
18
+ "mean_ms": 31.6
19
+ },
20
+ "4": {
21
+ "n": 300,
22
+ "p50_ms": 13.5,
23
+ "p95_ms": 99.6,
24
+ "mean_ms": 30.7
25
+ }
26
+ }
eval/bench_results/rpi5_16gb.json ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "device": {
3
+ "platform": "Linux-6.12.47+rpt-rpi-2712-aarch64-with-glibc2.41",
4
+ "python": "3.13.5",
5
+ "machine": "aarch64",
6
+ "numpy": "2.2.4",
7
+ "model": "Raspberry Pi 5 Model B Rev 1.1",
8
+ "cores": 4,
9
+ "governor": "ondemand"
10
+ },
11
+ "model_load_s": 0.2,
12
+ "params": 6441472,
13
+ "idle": {
14
+ "temp_c": 38.5,
15
+ "clock_mhz": 1500
16
+ },
17
+ "load": {
18
+ "prompts": 8334,
19
+ "wall_s": 600.1,
20
+ "p50_ms": 30.2,
21
+ "p95_ms": 243.9,
22
+ "p99_ms": 281.6,
23
+ "mean_ms": 72.0,
24
+ "max_temp_c": 59.8,
25
+ "throttled_any": [
26
+ "0x0"
27
+ ]
28
+ },
29
+ "windows": [
30
+ {
31
+ "minute": 1,
32
+ "n": 831,
33
+ "temp_c": 54.9,
34
+ "clock_mhz": 2400,
35
+ "mean_ms": 72.2,
36
+ "p50_ms": 30.7,
37
+ "p95_ms": 248.4,
38
+ "prompts_per_s": 13.86,
39
+ "throttled": [
40
+ "0x0"
41
+ ],
42
+ "fan_state": [
43
+ "1"
44
+ ]
45
+ },
46
+ {
47
+ "minute": 2,
48
+ "n": 806,
49
+ "temp_c": 57.6,
50
+ "clock_mhz": 2400,
51
+ "mean_ms": 74.5,
52
+ "p50_ms": 31.2,
53
+ "p95_ms": 242.3,
54
+ "prompts_per_s": 13.43,
55
+ "throttled": [
56
+ "0x0"
57
+ ],
58
+ "fan_state": [
59
+ "1"
60
+ ]
61
+ },
62
+ {
63
+ "minute": 3,
64
+ "n": 870,
65
+ "temp_c": 57.6,
66
+ "clock_mhz": 2400,
67
+ "mean_ms": 68.9,
68
+ "p50_ms": 28.3,
69
+ "p95_ms": 241.9,
70
+ "prompts_per_s": 14.5,
71
+ "throttled": [
72
+ "0x0"
73
+ ],
74
+ "fan_state": [
75
+ "1"
76
+ ]
77
+ },
78
+ {
79
+ "minute": 4,
80
+ "n": 817,
81
+ "temp_c": 58.7,
82
+ "clock_mhz": 2400,
83
+ "mean_ms": 73.5,
84
+ "p50_ms": 31.7,
85
+ "p95_ms": 247.8,
86
+ "prompts_per_s": 13.62,
87
+ "throttled": [
88
+ "0x0"
89
+ ],
90
+ "fan_state": [
91
+ "1"
92
+ ]
93
+ },
94
+ {
95
+ "minute": 5,
96
+ "n": 826,
97
+ "temp_c": 59.8,
98
+ "clock_mhz": 2400,
99
+ "mean_ms": 72.4,
100
+ "p50_ms": 29.9,
101
+ "p95_ms": 240.8,
102
+ "prompts_per_s": 13.77,
103
+ "throttled": [
104
+ "0x0"
105
+ ],
106
+ "fan_state": [
107
+ "1"
108
+ ]
109
+ },
110
+ {
111
+ "minute": 6,
112
+ "n": 853,
113
+ "temp_c": 59.8,
114
+ "clock_mhz": 2400,
115
+ "mean_ms": 70.5,
116
+ "p50_ms": 28.9,
117
+ "p95_ms": 243.1,
118
+ "prompts_per_s": 14.22,
119
+ "throttled": [
120
+ "0x0"
121
+ ],
122
+ "fan_state": [
123
+ "1",
124
+ "2"
125
+ ]
126
+ },
127
+ {
128
+ "minute": 7,
129
+ "n": 839,
130
+ "temp_c": 58.2,
131
+ "clock_mhz": 2400,
132
+ "mean_ms": 71.5,
133
+ "p50_ms": 30.8,
134
+ "p95_ms": 244.4,
135
+ "prompts_per_s": 13.98,
136
+ "throttled": [
137
+ "0x0"
138
+ ],
139
+ "fan_state": [
140
+ "2"
141
+ ]
142
+ },
143
+ {
144
+ "minute": 8,
145
+ "n": 827,
146
+ "temp_c": 58.2,
147
+ "clock_mhz": 2400,
148
+ "mean_ms": 72.5,
149
+ "p50_ms": 29.5,
150
+ "p95_ms": 243.5,
151
+ "prompts_per_s": 13.78,
152
+ "throttled": [
153
+ "0x0"
154
+ ],
155
+ "fan_state": [
156
+ "2"
157
+ ]
158
+ },
159
+ {
160
+ "minute": 9,
161
+ "n": 837,
162
+ "temp_c": 58.2,
163
+ "clock_mhz": 2400,
164
+ "mean_ms": 71.7,
165
+ "p50_ms": 29.6,
166
+ "p95_ms": 245.4,
167
+ "prompts_per_s": 13.95,
168
+ "throttled": [
169
+ "0x0"
170
+ ],
171
+ "fan_state": [
172
+ "2"
173
+ ]
174
+ },
175
+ {
176
+ "minute": 10,
177
+ "n": 827,
178
+ "temp_c": 58.7,
179
+ "clock_mhz": 2400,
180
+ "mean_ms": 72.5,
181
+ "p50_ms": 31.4,
182
+ "p95_ms": 241.1,
183
+ "prompts_per_s": 13.78,
184
+ "throttled": [
185
+ "0x0"
186
+ ],
187
+ "fan_state": [
188
+ "2"
189
+ ]
190
+ }
191
+ ],
192
+ "passes": [
193
+ {
194
+ "pass": 1,
195
+ "n": 2340,
196
+ "complete": true,
197
+ "temp_min_c": 41.1,
198
+ "temp_max_c": 57.6,
199
+ "clock_mhz": 2400,
200
+ "mean_ms": 72.2,
201
+ "p50_ms": 30.4,
202
+ "p95_ms": 244.5,
203
+ "prompts_per_s": 13.86
204
+ },
205
+ {
206
+ "pass": 2,
207
+ "n": 2340,
208
+ "complete": true,
209
+ "temp_min_c": 57.1,
210
+ "temp_max_c": 59.8,
211
+ "clock_mhz": 2400,
212
+ "mean_ms": 72.0,
213
+ "p50_ms": 30.2,
214
+ "p95_ms": 243.9,
215
+ "prompts_per_s": 13.9
216
+ },
217
+ {
218
+ "pass": 3,
219
+ "n": 2340,
220
+ "complete": true,
221
+ "temp_min_c": 56.5,
222
+ "temp_max_c": 59.3,
223
+ "clock_mhz": 2400,
224
+ "mean_ms": 71.9,
225
+ "p50_ms": 29.9,
226
+ "p95_ms": 243.8,
227
+ "prompts_per_s": 13.91
228
+ },
229
+ {
230
+ "pass": 4,
231
+ "n": 1314,
232
+ "complete": false,
233
+ "temp_min_c": 56.5,
234
+ "temp_max_c": 58.7,
235
+ "clock_mhz": 2400,
236
+ "mean_ms": 71.9,
237
+ "p50_ms": 30.5,
238
+ "p95_ms": 242.5,
239
+ "prompts_per_s": 13.9
240
+ }
241
+ ],
242
+ "accuracy": {
243
+ "curated": {
244
+ "n": 371,
245
+ "exact": 99.46,
246
+ "action": 99.73
247
+ },
248
+ "wifi_holdout": {
249
+ "n": 461,
250
+ "exact": 100.0,
251
+ "action": 100.0
252
+ },
253
+ "gap11_holdout": {
254
+ "n": 696,
255
+ "exact": 99.28,
256
+ "action": 100.0
257
+ },
258
+ "B_golden_final": {
259
+ "n": 384,
260
+ "exact": 97.4,
261
+ "action": 97.4
262
+ },
263
+ "A_practical-holdout": {
264
+ "n": 428,
265
+ "exact": 92.06,
266
+ "action": 94.16
267
+ }
268
+ },
269
+ "accuracy_all": {
270
+ "n": 2340,
271
+ "exact": 97.82,
272
+ "action": 98.46
273
+ },
274
+ "threads": {
275
+ "OPENBLAS_NUM_THREADS": "2",
276
+ "OMP_NUM_THREADS": "2"
277
+ }
278
+ }
eval/bench_results/rpi5_16gb_threads.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "default": {
3
+ "n": 300,
4
+ "p50_ms": 32.7,
5
+ "p95_ms": 286.1,
6
+ "mean_ms": 82.0
7
+ },
8
+ "1": {
9
+ "n": 300,
10
+ "p50_ms": 32.0,
11
+ "p95_ms": 295.2,
12
+ "mean_ms": 82.3
13
+ },
14
+ "2": {
15
+ "n": 300,
16
+ "p50_ms": 27.3,
17
+ "p95_ms": 232.6,
18
+ "mean_ms": 66.2
19
+ },
20
+ "4": {
21
+ "n": 300,
22
+ "p50_ms": 32.6,
23
+ "p95_ms": 280.5,
24
+ "mean_ms": 81.2
25
+ }
26
+ }
eval/bench_run_all.sh ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # usage: run_all.sh <python> <model> <data> <outdir> <thread options...>
2
+ PY=$1; M=$2; D=$3; O=$4; shift 4; best=""; bestms=999999
3
+ for t in "$@"; do
4
+ if [ "$t" = default ]; then env -u OPENBLAS_NUM_THREADS -u OMP_NUM_THREADS $PY bench_device.py --model $M --data $D --out $O/probe_$t.json --probe-only --probe-n 300
5
+ else OPENBLAS_NUM_THREADS=$t OMP_NUM_THREADS=$t $PY bench_device.py --model $M --data $D --out $O/probe_$t.json --probe-only --probe-n 300; fi
6
+ ms=$($PY -c "import json;print(json.load(open('$O/probe_$t.json'))['mean_ms'])"); echo "probe $t mean $ms"
7
+ if $PY -c "import sys;sys.exit(0 if $ms < $bestms else 1)"; then best=$t; bestms=$ms; fi
8
+ done
9
+ echo "best threads: $best"; sleep 120
10
+ if [ "$best" = default ]; then $PY bench_device.py --model $M --data $D --out $O/main.json --minutes 10
11
+ else OPENBLAS_NUM_THREADS=$best OMP_NUM_THREADS=$best $PY bench_device.py --model $M --data $D --out $O/main.json --minutes 10; fi
12
+ echo ALLDONE
eval/build_curated.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build the 'unique activity' test set: one held-out-template row per action, sampled from the model test split.
2
+ Prefers clean (no typo) variants and alternates Hinglish / English so the report reads naturally."""
3
+ import json, random, sys, os, collections
4
+ HERE = os.path.dirname(os.path.abspath(__file__)); ROOT = os.path.dirname(HERE)
5
+ sys.path.insert(0, os.path.join(ROOT, "model"))
6
+ from catalog import ACTIONS # noqa
7
+ random.seed(2026)
8
+ src = sys.argv[1] if len(sys.argv) > 1 else os.path.join(ROOT, "..", "union_model", "data", "test.jsonl")
9
+ rows = [json.loads(l) for l in open(src)]
10
+ by = collections.defaultdict(list)
11
+ for r in rows: by[r["action"]].append(r)
12
+ out = []
13
+ for a in ACTIONS:
14
+ cand = by.get(a, [])
15
+ if not cand: continue
16
+ clean = [r for r in cand if "typo" not in r.get("variant", "") and len(r["text"]) < 90] or cand
17
+ hi = [r for r in clean if any(w in r["text"].lower().split() for w in ("karo", "kar", "do", "batao", "dikhao", "kholo", "ka", "ki", "ke", "pe", "se", "hai", "kya"))]
18
+ en = [r for r in clean if r not in hi]
19
+ pick = random.choice(hi if (len(out) % 2 == 0 and hi) else (en or hi or clean))
20
+ dev = "pi" if ACTIONS[a]["platforms"] == ["pi"] else "windows" if ACTIONS[a]["platforms"] == ["windows"] else "both"
21
+ out.append({"text": pick["text"], "action": a, "target": pick["target"], "target_raw": pick.get("target_raw", pick["target"]), "device": dev, "risk": ACTIONS[a]["risk"], "group": pick["group"]})
22
+ with open(os.path.join(HERE, "curated_prompts.jsonl"), "w", encoding="utf-8") as f:
23
+ for r in out: f.write(json.dumps(r, ensure_ascii=False) + "\n")
24
+ print("curated prompts:", len(out), "actions covered", len({r['action'] for r in out}), "of", len(ACTIONS))
eval/curated_prompts.jsonl ADDED
@@ -0,0 +1,371 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"text": "online class hai toh /dev/sda1 fstab me daalo zara", "action": "add_persistent_mount", "target": "add_persistent_mount device=\"/dev/sda1\"", "target_raw": "add_persistent_mount device=\"/dev/sda1\"", "device": "both", "risk": "caution", "group": "G7:para:g3:add_persistent_mount:hi:1:2"}
2
+ {"text": "pi 5 pe aeroplane modw off kar do", "action": "airplane_mode_off", "target": "airplane_mode_off", "target_raw": "airplane_mode_off", "device": "both", "risk": "safe", "group": "G8:dev:B:airplane_mode_off:hi:1"}
3
+ {"text": "turn on airplane mode abhi ke abhi", "action": "airplane_mode_on", "target": "airplane_mode_on", "target_raw": "airplane_mode_on", "device": "both", "risk": "caution", "group": "G5:pol:airplane_mode_on:0:0"}
4
+ {"text": "mummy bula rahi hai, virus dhundo", "action": "antivirus_scan", "target": "antivirus_scan", "target_raw": "antivirus_scan", "device": "both", "risk": "caution", "group": "B:antivirus_scan:hi:5"}
5
+ {"text": "on win 11 tmux sessoin dev se jdo", "action": "attach_session", "target": "attach_session name=\"dev\"", "target_raw": "attach_session name=\"dev\"", "device": "both", "risk": "safe", "group": "G8:dev:G7:con:attach_session:0"}
6
+ {"text": "please back up mmcblk0 to an image ji", "action": "backup_disk_image", "target": "backup_disk_image device=\"mmcblk0\"", "target_raw": "backup_disk_image device=\"mmcblk0\"", "device": "both", "risk": "critical", "group": "G3:backup_disk_image:en:3"}
7
+ {"text": "rpi 5 pe battery saver mode band kar do turant", "action": "battery_saver_off", "target": "battery_saver_off", "target_raw": "battery_saver_off", "device": "both", "risk": "safe", "group": "G8:dev:B:battery_saver_off:hi:3"}
8
+ {"text": "i am done for today, start power saver thanks", "action": "battery_saver_on", "target": "battery_saver_on", "target_raw": "battery_saver_on", "device": "both", "risk": "safe", "group": "B:battery_saver_on:en:0"}
9
+ {"text": "pin 12 ka board number batana", "action": "bcm_to_board", "target": "bcm_to_board pin=12", "target_raw": "bcm_to_board pin=12", "device": "pi", "risk": "safe", "group": "G7:para:g6:bcm_to_board:hi:1:1"}
10
+ {"text": "could you connect to my mi band", "action": "bluetooth_connect", "target": "bluetooth_connect device=\"mi band\"", "target_raw": "bluetooth_connect device=\"mi band\"", "device": "both", "risk": "safe", "group": "G7:para:g:bluetooth_connect:en:0:0"}
11
+ {"text": "presentation hai switch the bt off", "action": "bluetooth_off", "target": "bluetooth_off", "target_raw": "bluetooth_off", "device": "both", "risk": "caution", "group": "B:bluetooth_off:en:3"}
12
+ {"text": "bluetooth chalu kro plz", "action": "bluetooth_on", "target": "bluetooth_on", "target_raw": "bluetooth_on", "device": "both", "risk": "caution", "group": "B:bluetooth_on:hi:5"}
13
+ {"text": "22 number pin bcm me kya hai", "action": "board_to_bcm", "target": "board_to_bcm pin=22 numbering=board", "target_raw": "board_to_bcm pin=22 numbering=board", "device": "pi", "risk": "safe", "group": "G6:board_to_bcm:hi:9"}
14
+ {"text": "is page ko bookmark kar do right now", "action": "bookmark_page", "target": "bookmark_page", "target_raw": "bookmark_page", "device": "both", "risk": "safe", "group": "G5:para:g:bookmark_page:hi:0:1"}
15
+ {"text": "raspberry pi 5 ki screen light kam kar de turant", "action": "brightness_down", "target": "brightness_down", "target_raw": "brightness_down", "device": "both", "risk": "safe", "group": "G8:dev:B:brightness_down:hi:0"}
16
+ {"text": "screen brightness +doos bhai", "action": "brightness_up", "target": "brightness_up step=10", "target_raw": "brightness_up step=10", "device": "both", "risk": "safe", "group": "B:brightness_up:en:14"}
17
+ {"text": "pi i need to back page abhi ke abhi", "action": "browser_back", "target": "browser_back", "target_raw": "browser_back", "device": "both", "risk": "safe", "group": "G7:para:g:browser_back:en:3:0"}
18
+ {"text": "forward kar dijiyega", "action": "browser_forward", "target": "browser_forward", "target_raw": "browser_forward", "device": "both", "risk": "safe", "group": "G7:para:g:browser_forward:hi:2:2"}
19
+ {"text": "/opt/app me project build kar dena jaldi pls", "action": "build_project", "target": "build_project path=\"/opt/app\"", "target_raw": "build_project path=\"/opt/app\"", "device": "both", "risk": "caution", "group": "G7:para:g3:build_project:hi:0:0"}
20
+ {"text": "windows 11 ki 2 ki power 10 equals what", "action": "calculate", "target": "calculate expression=\"2 ki power 10\"", "target_raw": "calculate expression=\"2 ki power 10\"", "device": "both", "risk": "safe", "group": "G8:dev:G5:new:calculate:4"}
21
+ {"text": "bhaiya camera se photo lo", "action": "camera_photo", "target": "camera_photo", "target_raw": "camera_photo", "device": "both", "risk": "safe", "group": "B:camera_photo:en:5"}
22
+ {"text": "कैमरा से 10 मिनट वीडियो रिकॉर्ड करो", "action": "camera_video", "target": "camera_video amount=10 unit=min", "target_raw": "camera_video amount=10 unit=min", "device": "pi", "risk": "safe", "group": "G:camera_video:hi:1"}
23
+ {"text": "alarm cancel karo quickly", "action": "cancel_alarm", "target": "cancel_alarm", "target_raw": "cancel_alarm", "device": "both", "risk": "safe", "group": "G5:para:g:cancel_alarm:hi:0:2"}
24
+ {"text": "bhai please abort the scheduled shutdown please", "action": "cancel_shutdown", "target": "cancel_shutdown", "target_raw": "cancel_shutdown", "device": "both", "risk": "caution", "group": "A:cancel_shutdown/test/0"}
25
+ {"text": "switch off the timer, battery bachani hai", "action": "cancel_timer", "target": "cancel_timer", "target_raw": "cancel_timer", "device": "both", "risk": "safe", "group": "G5:para:g:cancel_timer:en:1:2"}
26
+ {"text": "mummy bula rahi hai, accelerator status bataiyega zara", "action": "check_ai_accelerator", "target": "check_ai_accelerator", "target_raw": "check_ai_accelerator", "device": "pi", "risk": "safe", "group": "G7:para:g2:check_ai_accelerator:hi:2:0"}
27
+ {"text": "padhai karni hai so nvme0n1 ka filesystem check karna plz on the rpi 5", "action": "check_filesystem", "target": "check_filesystem device=\"nvme0n1\"", "target_raw": "check_filesystem device=\"nvme0n1\"", "device": "both", "risk": "critical", "group": "G8:dev:G5:para:g3:check_filesystem:hi:0:1"}
28
+ {"text": "look at port 5900 on 8.8.8.8", "action": "check_port", "target": "check_port host=\"8.8.8.8\" port=5900", "target_raw": "check_port host=\"8.8.8.8\" port=5900", "device": "both", "risk": "safe", "group": "G5:para:g2:check_port:en:0:1"}
29
+ {"text": "ek kaam karo is my system up to date", "action": "check_updates", "target": "check_updates", "target_raw": "check_updates", "device": "both", "risk": "safe", "group": "B:check_updates:en:4"}
30
+ {"text": "led bujhao", "action": "clarify", "target": "clarify action=gpio_off", "target_raw": "clarify action=gpio_off", "device": "both", "risk": "safe", "group": "G6:clarify:gpio_off:1"}
31
+ {"text": "yaar saari notifications hatao on the rpi 5", "action": "clear_notifications", "target": "clear_notifications", "target_raw": "clear_notifications", "device": "both", "risk": "safe", "group": "G8:dev:G5:para:g:clear_notifications:hi:0:0"}
32
+ {"text": "pi5 me temproary data mitao", "action": "clear_temp_files", "target": "clear_temp_files", "target_raw": "clear_temp_files", "device": "both", "risk": "critical", "group": "G8:dev:B:clear_temp_files:hi:1"}
33
+ {"text": "presentation hai toh copy kiya hua sab dikhao", "action": "clipboard_history", "target": "clipboard_history", "target_raw": "clipboard_history", "device": "both", "risk": "safe", "group": "G5:para:g:clipboard_history:hi:1:2"}
34
+ {"text": "i need to rpi-clone to mmcblk0", "action": "clone_disk", "target": "clone_disk device=\"mmcblk0\"", "target_raw": "clone_disk device=\"mmcblk0\"", "device": "both", "risk": "critical", "group": "G7:para:g3:clone_disk:en:2:2"}
35
+ {"text": "close spreadsheet window because main so raha hoon windows 11 pe", "action": "close_app", "target": "close_app app=excel", "target_raw": "close_app app=excel", "device": "both", "risk": "caution", "group": "G8:dev:B:close_app:en:6"}
36
+ {"text": "mere windows 11 laptop pe hi is tab ko band karo abhi", "action": "close_tab", "target": "close_tab", "target_raw": "close_tab", "device": "both", "risk": "safe", "group": "G8:dev:B:close_tab:hi:2"}
37
+ {"text": "can you pls close this windows 11 pe", "action": "close_window", "target": "close_window", "target_raw": "close_window", "device": "both", "risk": "caution", "group": "G8:dev:B:close_window:en:1"}
38
+ {"text": "create an archive of fimwoot dosti", "action": "compress_file", "target": "compress_file path=\"fimwoot dosti\"", "target_raw": "compress_file path=\"fimwoot dosti\"", "device": "both", "risk": "safe", "group": "G:compress_file:en:2"}
39
+ {"text": "computer office-guest ka password Summer2025 hai connect kar do jaldi se", "action": "connect_wifi", "target": "connect_wifi ssid=\"office-guest\" password=\"summer2025\"", "target_raw": "connect_wifi ssid=\"office-guest\" password=\"Summer2025\"", "device": "both", "risk": "caution", "group": "G4:connect_wifi:5"}
40
+ {"text": "note.wav ko 16khz wav me convert kar dena plz", "action": "convert_media", "target": "convert_media file=\"note.wav\" format=\"16khz wav\"", "target_raw": "convert_media file=\"note.wav\" format=\"16khz wav\"", "device": "both", "risk": "caution", "group": "G5:para:g3:convert_media:hi:0:0"}
41
+ {"text": "raspberry pi 5 pe copy kao", "action": "copy", "target": "copy", "target_raw": "copy", "device": "both", "risk": "safe", "group": "G8:dev:G5:syn:copy:1"}
42
+ {"text": "could you please duplicate the file \"demo/old17.txt\" as \"demo/new11.txt\" please", "action": "copy_file", "target": "copy_file src=\"demo/old17.txt\" dst=\"demo/new11.txt\"", "target_raw": "copy_file src=\"demo/old17.txt\" dst=\"demo/new11.txt\"", "device": "both", "risk": "caution", "group": "A:copy_file/test/0"}
43
+ {"text": "jaldi se github.com pe ssh key bhejo please", "action": "copy_ssh_key", "target": "copy_ssh_key host=\"github.com\"", "target_raw": "copy_ssh_key host=\"github.com\"", "device": "both", "risk": "caution", "group": "G7:para:g3:copy_ssh_key:hi:0:0"}
44
+ {"text": "hey assistant aaj shaam 6 baje ke liye sprint review schedule karo, aankh dukh rahi hai", "action": "create_calendar_event", "target": "create_calendar_event title=\"sprint review\" time=\"aaj shaam 6 baje\"", "target_raw": "create_calendar_event title=\"sprint review\" time=\"aaj shaam 6 baje\"", "device": "both", "risk": "safe", "group": "G5:new:create_calendar_event:6"}
45
+ {"text": "bhai \"work/report1.txt\" naam ki nayi file banaana please on the rpi 5", "action": "create_file", "target": "create_file path=\"work/report1.txt\"", "target_raw": "create_file path=\"work/report1.txt\"", "device": "both", "risk": "caution", "group": "G8:dev:A:create_file/contrastive/0"}
46
+ {"text": "bachche so rahe hain, \"tax 2025/old\" directory bana quickly", "action": "create_folder", "target": "create_folder path=\"tax 2025/old\"", "target_raw": "create_folder path=\"tax 2025/old\"", "device": "both", "risk": "caution", "group": "G5:fileop:create_folder:7"}
47
+ {"text": "could you mqtt-bridge ko boot pe chalane ki service banao bhai", "action": "create_service", "target": "create_service name=\"mqtt-bridge\"", "target_raw": "create_service name=\"mqtt-bridge\"", "device": "both", "risk": "critical", "group": "G7:para:g3:create_service:hi:1:1"}
48
+ {"text": "~/script.sh ko /mnt/usb se link karo abhi", "action": "create_symlink", "target": "create_symlink path=\"~/script.sh\" link=\"/mnt/usb\"", "target_raw": "create_symlink path=\"~/script.sh\" link=\"/mnt/usb\"", "device": "both", "risk": "caution", "group": "G3:create_symlink:hi:55"}
49
+ {"text": "./deploy.sh me virtual environment setup karo plz", "action": "create_virtualenv", "target": "create_virtualenv path=\"./deploy.sh\"", "target_raw": "create_virtualenv path=\"./deploy.sh\"", "device": "both", "risk": "caution", "group": "G3:create_virtualenv:hi:94"}
50
+ {"text": "isko cut karo.", "action": "cut", "target": "cut", "target_raw": "cut", "device": "both", "risk": "safe", "group": "B:cut:hi:1"}
51
+ {"text": "swich off dark mod bhai windows 11 pe", "action": "dark_mode_off", "target": "dark_mode_off", "target_raw": "dark_mode_off", "device": "both", "risk": "safe", "group": "G8:dev:B:dark_mode_off:en:0"}
52
+ {"text": "black theme laga do, bahut der ho gayi on windows 11", "action": "dark_mode_on", "target": "dark_mode_on", "target_raw": "dark_mode_on", "device": "both", "risk": "safe", "group": "G8:dev:B:dark_mode_on:hi:2"}
53
+ {"text": "is windows 11 pc pe trash baccho_3.pptx", "action": "delete_file", "target": "delete_file path=\"baccho_3.pptx\"", "target_raw": "delete_file path=\"baccho_3.pptx\"", "device": "both", "risk": "critical", "group": "G8:dev:B:delete_file:en:3"}
54
+ {"text": "please jaldi disable unattended upgrades", "action": "disable_auto_updates", "target": "disable_auto_updates", "target_raw": "disable_auto_updates", "device": "both", "risk": "caution", "group": "G5:para:g3:disable_auto_updates:en:1:0"}
55
+ {"text": "on win 11 local dvices discover kar dijiye", "action": "discover_devices", "target": "discover_devices", "target_raw": "discover_devices", "device": "both", "risk": "safe", "group": "G8:dev:G7:para:g2:discover_devices:hi:1:0"}
56
+ {"text": "switch display to sirf laptop screen", "action": "display_mode", "target": "display_mode mode=pc_only", "target_raw": "display_mode mode=pc_only", "device": "both", "risk": "safe", "group": "B:display_mode:en:3"}
57
+ {"text": "do not disturb off karo, main chai peene ja raha hoon", "action": "dnd_off", "target": "dnd_off", "target_raw": "dnd_off", "device": "both", "risk": "safe", "group": "G5:pol:dnd_off:0:2"}
58
+ {"text": "dnd on krao", "action": "dnd_on", "target": "dnd_on", "target_raw": "dnd_on", "device": "both", "risk": "safe", "group": "G5:pol:dnd_on:1:2"}
59
+ {"text": "mere liye example.com domain ka dns check karo for me", "action": "dns_lookup", "target": "dns_lookup host=\"example.com\"", "target_raw": "dns_lookup host=\"example.com\"", "device": "both", "risk": "safe", "group": "A:dns_lookup/test/1"}
60
+ {"text": "can you bring up docker compose services, ghar ja raha hoon", "action": "docker_compose_up", "target": "docker_compose_up", "target_raw": "docker_compose_up", "device": "both", "risk": "caution", "group": "G7:para:g3:docker_compose_up:en:2:0"}
61
+ {"text": "could you please list running containers abhi ke abhi", "action": "docker_list", "target": "docker_list", "target_raw": "docker_list", "device": "both", "risk": "safe", "group": "G7:para:g3:docker_list:en:0:1"}
62
+ {"text": "hey pi docker clean kar!", "action": "docker_prune", "target": "docker_prune", "target_raw": "docker_prune", "device": "both", "risk": "critical", "group": "G5:para:g3:docker_prune:hi:0:2"}
63
+ {"text": "docker se node-red run kar dena", "action": "docker_run", "target": "docker_run image=\"node-red\"", "target_raw": "docker_run image=\"node-red\"", "device": "both", "risk": "caution", "group": "G5:para:g3:docker_run:hi:1:2"}
64
+ {"text": "web container bandh karo, main so raha hoon", "action": "docker_stop", "target": "docker_stop container=\"web\"", "target_raw": "docker_stop container=\"web\"", "device": "both", "risk": "caution", "group": "G5:para:g3:docker_stop:hi:0:0"}
65
+ {"text": "hey laptop wgivve me https://example.com/file.tar.gz windows 11 pe", "action": "download_file", "target": "download_file url=\"https://example.com/file.tar.gz\"", "target_raw": "download_file url=\"https://example.com/file.tar.gz\"", "device": "both", "risk": "caution", "group": "G8:dev:G7:para:g3:download_file:en:1:1"}
66
+ {"text": "hi i need to free the cached memory", "action": "drop_caches", "target": "drop_caches", "target_raw": "drop_caches", "device": "both", "risk": "critical", "group": "G7:para:g3:drop_caches:en:2:1"}
67
+ {"text": "meeting shuru hone wali hai, config.txt edit karo", "action": "edit_system_config", "target": "edit_system_config", "target_raw": "edit_system_config", "device": "both", "risk": "critical", "group": "G2:edit_system_config:hi:66"}
68
+ {"text": "can you emoji wala keyboard khol", "action": "emoji_panel", "target": "emoji_panel", "target_raw": "emoji_panel", "device": "both", "risk": "safe", "group": "G5:para:g:emoji_panel:hi:1:2"}
69
+ {"text": "kachra dabba khali kr do yaar", "action": "empty_recycle_bin", "target": "empty_recycle_bin", "target_raw": "empty_recycle_bin", "device": "both", "risk": "critical", "group": "B:empty_recycle_bin:hi:0"}
70
+ {"text": "ji could you install security patches automatically", "action": "enable_auto_updates", "target": "enable_auto_updates", "target_raw": "enable_auto_updates", "device": "both", "risk": "caution", "group": "G7:para:g3:enable_auto_updates:en:2:0"}
71
+ {"text": "switch on zram swap jaldi se", "action": "enable_zram", "target": "enable_zram", "target_raw": "enable_zram", "device": "both", "risk": "caution", "group": "G7:para:g3:enable_zram:en:2:2"}
72
+ {"text": "poora sd card use karna.", "action": "expand_filesystem", "target": "expand_filesystem", "target_raw": "expand_filesystem", "device": "pi", "risk": "critical", "group": "G5:para:g3:expand_filesystem:hi:2:0"}
73
+ {"text": "pi5 me invoice.zip khop ke files nikalo now", "action": "extract_archive", "target": "extract_archive path=\"invoice.zip\"", "target_raw": "extract_archive path=\"invoice.zip\"", "device": "both", "risk": "safe", "group": "G8:dev:G:extract_archive:hi:1"}
74
+ {"text": "BHAI PLEASE RESTORE FACTORY SETTINGS ON THIS COMPUTER NA", "action": "factory_reset", "target": "factory_reset", "target_raw": "factory_reset", "device": "both", "risk": "critical", "group": "A:factory_reset/test/0"}
75
+ {"text": "pi 5 pe i want to whee is ollama installed", "action": "find_command", "target": "find_command name=\"ollama\"", "target_raw": "find_command name=\"ollama\"", "device": "both", "risk": "safe", "group": "G8:dev:G7:para:g2:find_command:en:0:0"}
76
+ {"text": "i need to look for redis cache on the page", "action": "find_in_page", "target": "find_in_page query=\"redis cache\"", "target_raw": "find_in_page query=\"redis cache\"", "device": "both", "risk": "safe", "group": "G7:para:g:find_in_page:en:2:1"}
77
+ {"text": "rpi5 pe please allow prt 11434 in feerewall turant", "action": "firewall_allow", "target": "firewall_allow port=11434", "target_raw": "firewall_allow port=11434", "device": "both", "risk": "caution", "group": "G8:dev:G7:para:g3:firewall_allow:en:0:0"}
78
+ {"text": "i want to ufw deny 80", "action": "firewall_deny", "target": "firewall_deny port=80", "target_raw": "firewall_deny port=80", "device": "both", "risk": "critical", "group": "G7:para:g3:firewall_deny:en:2:1"}
79
+ {"text": "the firewall band karo, battery bachani hai", "action": "firewall_off", "target": "firewall_off", "target_raw": "firewall_off", "device": "both", "risk": "critical", "group": "G5:pol:firewall_off:1:3"}
80
+ {"text": "on win 11 enable the firewall.", "action": "firewall_on", "target": "firewall_on", "target_raw": "firewall_on", "device": "both", "risk": "caution", "group": "G8:dev:B:firewall_on:en:2"}
81
+ {"text": "system ke firewall ki details bata dena abhi", "action": "firewall_status", "target": "firewall_status", "target_raw": "firewall_status", "device": "both", "risk": "safe", "group": "A:show_firewall/test/1"}
82
+ {"text": "i want to add me to the gpio group now", "action": "fix_gpio_permissions", "target": "fix_gpio_permissions", "target_raw": "fix_gpio_permissions", "device": "pi", "risk": "caution", "group": "G7:para:g6:fix_gpio_permissions:en:1:2"}
83
+ {"text": "call aane wala hai toh launch rpi-update", "action": "flash_firmware", "target": "flash_firmware", "target_raw": "flash_firmware", "device": "both", "risk": "critical", "group": "G7:para:g3:flash_firmware:en:1:1"}
84
+ {"text": "kindly please flush my computer's dns cache please", "action": "flush_dns", "target": "flush_dns", "target_raw": "flush_dns", "device": "both", "risk": "caution", "group": "A:flush_dns/test/0"}
85
+ {"text": "bhai forget the network OnePlus Nord mere windows 11 pe", "action": "forget_wifi", "target": "forget_wifi ssid=\"oneplus nord\"", "target_raw": "forget_wifi ssid=\"OnePlus Nord\"", "device": "both", "risk": "caution", "group": "G8:dev:G4:forget_wifi:4"}
86
+ {"text": "HEY COMPUTER PLEASE FORMAT MY STORAGE DEVICE ABHI", "action": "format_drive", "target": "format_drive", "target_raw": "format_drive", "device": "both", "risk": "critical", "group": "A:format_drive/test/0"}
87
+ {"text": "rpi5 pe toggle full screen", "action": "fullscreen", "target": "fullscreen", "target_raw": "fullscreen", "device": "both", "risk": "safe", "group": "G8:dev:G:fullscreen:en:1"}
88
+ {"text": "bachche so rahe hain so print bandwidth usage", "action": "get_bandwidth_usage", "target": "get_bandwidth_usage", "target_raw": "get_bandwidth_usage", "device": "both", "risk": "safe", "group": "G7:para:g2:get_bandwidth_usage:en:0:1"}
89
+ {"text": "bhai laptop ki battery abhi kitni hai abhi", "action": "get_battery", "target": "get_battery", "target_raw": "get_battery", "device": "both", "risk": "safe", "group": "A:show_battery/test/1"}
90
+ {"text": "which firmware settings are active, i'll be back", "action": "get_boot_config", "target": "get_boot_config", "target_raw": "get_boot_config", "device": "pi", "risk": "safe", "group": "G2:get_boot_config:en:12"}
91
+ {"text": "raspberry pi 5 ki fetch previous bolt logs", "action": "get_boot_logs", "target": "get_boot_logs", "target_raw": "get_boot_logs", "device": "both", "risk": "safe", "group": "G8:dev:G7:para:g2:get_boot_logs:en:0:1"}
92
+ {"text": "systemd-analyze plz", "action": "get_boot_time", "target": "get_boot_time", "target_raw": "get_boot_time", "device": "both", "risk": "safe", "group": "G5:syn:get_boot_time:3"}
93
+ {"text": "bhai check my display brightness level kar sakte ho", "action": "get_brightness", "target": "get_brightness", "target_raw": "get_brightness", "device": "both", "risk": "safe", "group": "A:show_brightness/test/0"}
94
+ {"text": "please tell me the current pi cpu frequency please", "action": "get_cpu_clock", "target": "get_cpu_clock", "target_raw": "get_cpu_clock", "device": "pi", "risk": "safe", "group": "A:show_clock/test/0"}
95
+ {"text": "movie dekhni hai toh show is the cpu governor", "action": "get_cpu_governor", "target": "get_cpu_governor", "target_raw": "get_cpu_governor", "device": "pi", "risk": "safe", "group": "G2:get_cpu_governor:en:27"}
96
+ {"text": "tell me cpu pressure plz", "action": "get_cpu_pressure", "target": "get_cpu_pressure", "target_raw": "get_cpu_pressure", "device": "both", "risk": "safe", "group": "G5:para:g2:get_cpu_pressure:en:0:1"}
97
+ {"text": "on my laptop cpu pe kitna load hai kijiye pi 5 pe", "action": "get_cpu_usage", "target": "get_cpu_usage", "target_raw": "get_cpu_usage", "device": "both", "risk": "safe", "group": "G8:dev:A:show_cpu/practical/1"}
98
+ {"text": "mere liye tell me the active login username", "action": "get_current_user", "target": "get_current_user", "target_raw": "get_current_user", "device": "both", "risk": "safe", "group": "A:show_user/test/0"}
99
+ {"text": "can you abhi system ki date kya hai na", "action": "get_date", "target": "get_date", "target_raw": "get_date", "device": "both", "risk": "safe", "group": "A:show_time/test/1"}
100
+ {"text": "default gateway, bahut der ho gayi", "action": "get_default_gateway", "target": "get_default_gateway", "target_raw": "get_default_gateway", "device": "both", "risk": "safe", "group": "G2:get_default_gateway:en:95"}
101
+ {"text": "jaldi se generate a diagnostics report", "action": "get_diagnostics", "target": "get_diagnostics", "target_raw": "get_diagnostics", "device": "both", "risk": "safe", "group": "G7:con:get_diagnostics:5"}
102
+ {"text": "disk health check karke dikhaiyega jaldi", "action": "get_disk_health", "target": "get_disk_health", "target_raw": "get_disk_health", "device": "both", "risk": "safe", "group": "G7:para:g2:get_disk_health:hi:0:0"}
103
+ {"text": "sun disk activity dikhao", "action": "get_disk_io", "target": "get_disk_io", "target_raw": "get_disk_io", "device": "both", "risk": "safe", "group": "G2:get_disk_io:hi:6"}
104
+ {"text": "TELL ME AVAILABLE DISK STORAGE NA", "action": "get_disk_space", "target": "get_disk_space", "target_raw": "get_disk_space", "device": "both", "risk": "safe", "group": "A:show_disk/test/0"}
105
+ {"text": "ethernet speed dikha do", "action": "get_ethernet_status", "target": "get_ethernet_status", "target_raw": "get_ethernet_status", "device": "both", "risk": "safe", "group": "G5:para:g2:get_ethernet_status:hi:0:2"}
106
+ {"text": "coooler ki speed", "action": "get_fan_speed", "target": "get_fan_speed", "target_raw": "get_fan_speed", "device": "pi", "risk": "safe", "group": "G5:syn:get_fan_speed:3"}
107
+ {"text": "hey assistant videocore log dikhao", "action": "get_firmware_log", "target": "get_firmware_log", "target_raw": "get_firmware_log", "device": "pi", "risk": "safe", "group": "G3:get_firmware_log:hi:32"}
108
+ {"text": "kindly tell me the installed pi firmware version please", "action": "get_firmware_version", "target": "get_firmware_version", "target_raw": "get_firmware_version", "device": "pi", "risk": "safe", "group": "A:show_firmware/test/0"}
109
+ {"text": "folders are using the most space, neend aa rahi hai", "action": "get_folder_sizes", "target": "get_folder_sizes", "target_raw": "get_folder_sizes", "device": "both", "risk": "safe", "group": "G5:para:g2:get_folder_sizes:en:0:2"}
110
+ {"text": "gpu memory dikhao, main abhi aata hoon", "action": "get_gpu_memory", "target": "get_gpu_memory", "target_raw": "get_gpu_memory", "device": "pi", "risk": "safe", "group": "G7:para:g2:get_gpu_memory:hi:0:1"}
111
+ {"text": "bhaiya graphics card ka load show kar quickly", "action": "get_gpu_usage", "target": "get_gpu_usage", "target_raw": "get_gpu_usage", "device": "both", "risk": "safe", "group": "G7:para:g:get_gpu_usage:hi:1:0"}
112
+ {"text": "tell me the name of this host abhi", "action": "get_hostname", "target": "get_hostname", "target_raw": "get_hostname", "device": "both", "risk": "safe", "group": "A:show_hostname/test/0"}
113
+ {"text": "kaam khatam ho gaya, interrpts batao pi 5 pe", "action": "get_interrupts", "target": "get_interrupts", "target_raw": "get_interrupts", "device": "both", "risk": "safe", "group": "G8:dev:G3:get_interrupts:hi:14"}
114
+ {"text": "CAN YOU TELL ME THIS COMPUTER'S NETWORK ADDRESS FOR ME", "action": "get_ip", "target": "get_ip", "target_raw": "get_ip", "device": "both", "risk": "safe", "group": "A:show_ip/test/0"}
115
+ {"text": "pi kernel ke messages dikhaiye", "action": "get_kernel_log", "target": "get_kernel_log", "target_raw": "get_kernel_log", "device": "both", "risk": "safe", "group": "G5:para:g2:get_kernel_log:hi:2:0"}
116
+ {"text": "kernel version dikhana now", "action": "get_kernel_version", "target": "get_kernel_version", "target_raw": "get_kernel_version", "device": "both", "risk": "safe", "group": "G7:para:g2:get_kernel_version:hi:0:2"}
117
+ {"text": "hey load average kya hai bolo", "action": "get_load_average", "target": "get_load_average", "target_raw": "get_load_average", "device": "both", "risk": "safe", "group": "G7:para:g2:get_load_average:hi:0:2"}
118
+ {"text": "kindly mac address dikha", "action": "get_mac_address", "target": "get_mac_address", "target_raw": "get_mac_address", "device": "both", "risk": "safe", "group": "G7:para:g:get_mac_address:hi:0:2"}
119
+ {"text": "rpi5 pe call aane wala hai so memory pressure batao fast", "action": "get_memory_pressure", "target": "get_memory_pressure", "target_raw": "get_memory_pressure", "device": "both", "risk": "safe", "group": "G8:dev:G7:para:g2:get_memory_pressure:hi:0:2"}
120
+ {"text": "what is percore usage on windows 11", "action": "get_per_core_usage", "target": "get_per_core_usage", "target_raw": "get_per_core_usage", "device": "both", "risk": "safe", "group": "G8:dev:G5:para:g2:get_per_core_usage:en:0:2"}
121
+ {"text": "show power draw, battery bachani hai", "action": "get_power_draw", "target": "get_power_draw", "target_raw": "get_power_draw", "device": "pi", "risk": "safe", "group": "G2:get_power_draw:en:42"}
122
+ {"text": "external ip dikhao, bahut der ho gayi", "action": "get_public_ip", "target": "get_public_ip", "target_raw": "get_public_ip", "device": "both", "risk": "safe", "group": "G5:para:g:get_public_ip:hi:1:2"}
123
+ {"text": "wifi bluetooth block hai kya zara abhi", "action": "get_radio_status", "target": "get_radio_status", "target_raw": "get_radio_status", "device": "both", "risk": "safe", "group": "G7:para:g2:get_radio_status:hi:0:1"}
124
+ {"text": "can you tell me available system memory zara", "action": "get_ram_usage", "target": "get_ram_usage", "target_raw": "get_ram_usage", "device": "both", "risk": "safe", "group": "A:show_memory/test/0"}
125
+ {"text": "mummy bula rahi hai so reboot history dikhao", "action": "get_reboot_history", "target": "get_reboot_history", "target_raw": "get_reboot_history", "device": "both", "risk": "safe", "group": "G5:para:g2:get_reboot_history:hi:0:2"}
126
+ {"text": "i need to which sd card is this", "action": "get_sdcard_info", "target": "get_sdcard_info", "target_raw": "get_sdcard_info", "device": "pi", "risk": "safe", "group": "G7:para:g2:get_sdcard_info:en:1:1"}
127
+ {"text": "could you please vnc service ke logs batqo mere windows 11 pe", "action": "get_service_logs", "target": "get_service_logs service=vnc", "target_raw": "get_service_logs service=vnc", "device": "both", "risk": "safe", "group": "G8:dev:G2:get_service_logs:hi:92"}
128
+ {"text": "hey slab usage dikhaiye jaldi", "action": "get_slab_usage", "target": "get_slab_usage", "target_raw": "get_slab_usage", "device": "both", "risk": "safe", "group": "G5:para:g3:get_slab_usage:hi:0:0"}
129
+ {"text": "main bahar ja raha hoon so swap status dikhao zara", "action": "get_swap_usage", "target": "get_swap_usage", "target_raw": "get_swap_usage", "device": "both", "risk": "safe", "group": "G7:para:g2:get_swap_usage:hi:2:2"}
130
+ {"text": "which windows version is this now", "action": "get_system_info", "target": "get_system_info", "target_raw": "get_system_info", "device": "both", "risk": "safe", "group": "B:get_system_info:en:3"}
131
+ {"text": "pi garam ho raha hai kya fast", "action": "get_temperature", "target": "get_temperature", "target_raw": "get_temperature", "device": "both", "risk": "safe", "group": "B:get_temperature:hi:3"}
132
+ {"text": "tell me the raspberry pi throttling flags abhi", "action": "get_throttle_status", "target": "get_throttle_status", "target_raw": "get_throttle_status", "device": "both", "risk": "safe", "group": "A:show_throttling/test/0"}
133
+ {"text": "please retrieve systme date and time abhi mere windows 11 pe", "action": "get_time", "target": "get_time", "target_raw": "get_time", "device": "both", "risk": "safe", "group": "G8:dev:A:show_time/language/1"}
134
+ {"text": "i need to ntp sync status", "action": "get_time_sync", "target": "get_time_sync", "target_raw": "get_time_sync", "device": "both", "risk": "safe", "group": "G7:para:g2:get_time_sync:en:1:2"}
135
+ {"text": "can you uptime kitna hai", "action": "get_uptime", "target": "get_uptime", "target_raw": "get_uptime", "device": "both", "risk": "safe", "group": "B:get_uptime:hi:4"}
136
+ {"text": "zara tell me the raspberry pi core voltage abhi", "action": "get_voltage", "target": "get_voltage", "target_raw": "get_voltage", "device": "pi", "risk": "safe", "group": "A:show_voltage/test/0"}
137
+ {"text": "zara crurent volume percentage bataiye pi 5 pe", "action": "get_volume", "target": "get_volume", "target_raw": "get_volume", "device": "both", "risk": "safe", "group": "G8:dev:A:show_volume/practical/3"}
138
+ {"text": "kindly could you show the wifi signal strength, khana khane ja raha hoon", "action": "get_wifi_signal", "target": "get_wifi_signal", "target_raw": "get_wifi_signal", "device": "both", "risk": "safe", "group": "G7:para:g2:get_wifi_signal:en:0:1"}
139
+ {"text": "kaam khatam ho gaya toh can you display the functions available on gpio 26 abhi ke abhi", "action": "gpio_alt_functions", "target": "gpio_alt_functions pin=26", "target_raw": "gpio_alt_functions pin=26", "device": "pi", "risk": "safe", "group": "G7:para:g6:gpio_alt_functions:en:2:1"}
140
+ {"text": "plz flas physical 28 dus ties please", "action": "gpio_blink", "target": "gpio_blink pin=28 numbering=board count=10", "target_raw": "gpio_blink pin=28 numbering=board count=10", "device": "pi", "risk": "caution", "group": "G6:gpio_blink:en:4"}
141
+ {"text": "list reerved pins, call pe hoon", "action": "gpio_conflicts", "target": "gpio_conflicts", "target_raw": "gpio_conflicts", "device": "pi", "risk": "safe", "group": "G6:gpio_conflicts:en:3"}
142
+ {"text": "buttom on gpio26 is not deteced thanks", "action": "gpio_debug", "target": "gpio_debug pin=26", "target_raw": "gpio_debug pin=26", "device": "pi", "risk": "safe", "group": "G6:gpio_debug:en:10"}
143
+ {"text": "gpio kaam nahi kar raha please pls", "action": "gpio_debug_all", "target": "gpio_debug_all", "target_raw": "gpio_debug_all", "device": "pi", "risk": "safe", "group": "G7:para:g6:gpio_debug_all:hi:0:0"}
144
+ {"text": "on win 11 pinctrl get gpio 22 plz", "action": "gpio_info", "target": "gpio_info pin=22", "target_raw": "gpio_info pin=22", "device": "pi", "risk": "safe", "group": "G8:dev:G6:gpio_info:en:3"}
145
+ {"text": "set low gpio pin 14 windows 11 pe", "action": "gpio_off", "target": "gpio_off pin=14", "target_raw": "gpio_off pin=14", "device": "both", "risk": "critical", "group": "G8:dev:B:gpio_off:en:0"}
146
+ {"text": "on windows 11 set pin no 11 high", "action": "gpio_on", "target": "gpio_on pin=11 numbering=board", "target_raw": "gpio_on pin=11 numbering=board", "device": "both", "risk": "critical", "group": "G8:dev:G6:gpio_on:en:0"}
147
+ {"text": "gpio22 kis kaam ka hai zara", "action": "gpio_pin_role", "target": "gpio_pin_role pin=22", "target_raw": "gpio_pin_role pin=22", "device": "pi", "risk": "safe", "group": "G7:para:g6:gpio_pin_role:hi:0:2"}
148
+ {"text": "40-pin header pin 27 ko a minute on rakho please", "action": "gpio_pulse", "target": "gpio_pulse pin=27 amount=1 unit=min numbering=board", "target_raw": "gpio_pulse pin=27 amount=1 unit=min numbering=board", "device": "pi", "risk": "caution", "group": "G7:para:g6:gpio_pulse:hi:4:0"}
149
+ {"text": "pi 5 pe laptop can you run 25000 hz pwm on bcm 23 with 90 percent duty", "action": "gpio_pwm", "target": "gpio_pwm pin=23 duty=90 freq=25000", "target_raw": "gpio_pwm pin=23 duty=90 freq=25000", "device": "pi", "risk": "caution", "group": "G8:dev:G7:para:g6:gpio_pwm:en:6:0"}
150
+ {"text": "hey computer please read the value of gpio pin 24 for me", "action": "gpio_read", "target": "gpio_read pin=24", "target_raw": "gpio_read pin=24", "device": "both", "risk": "caution", "group": "A:gpio_read/test/0"}
151
+ {"text": "pin no 7 ko wapas input bana do", "action": "gpio_reset", "target": "gpio_reset pin=7 numbering=board", "target_raw": "gpio_reset pin=7 numbering=board", "device": "pi", "risk": "caution", "group": "G6:gpio_reset:hi:8"}
152
+ {"text": "can you please set every pin back to default right now", "action": "gpio_reset_all", "target": "gpio_reset_all", "target_raw": "gpio_reset_all", "device": "pi", "risk": "caution", "group": "G6:gpio_reset_all:en:2"}
153
+ {"text": "rpi 5 pe padhai karni hai so move the servo on physical 22 to 45 degrees", "action": "gpio_servo", "target": "gpio_servo pin=22 angle=45 numbering=board", "target_raw": "gpio_servo pin=22 angle=45 numbering=board", "device": "pi", "risk": "caution", "group": "G8:dev:G6:gpio_servo:en:0"}
154
+ {"text": "hey laptop i need to switch gpio22 to alt2", "action": "gpio_set_alt", "target": "gpio_set_alt pin=22 alt=a2", "target_raw": "gpio_set_alt pin=22 alt=a2", "device": "pi", "risk": "critical", "group": "G7:para:g6:gpio_set_alt:en:1:2"}
155
+ {"text": "gpio pin 19 input pin kar do", "action": "gpio_set_mode", "target": "gpio_set_mode pin=19 mode=input", "target_raw": "gpio_set_mode pin=19 mode=input", "device": "pi", "risk": "caution", "group": "G6:gpio_set_mode:hi:8"}
156
+ {"text": "on my raspberry pi 5 hello enable pull up on gpio 10", "action": "gpio_set_pull", "target": "gpio_set_pull pin=10 pull=up", "target_raw": "gpio_set_pull pin=10 pull=up", "device": "pi", "risk": "caution", "group": "G8:dev:G6:gpio_set_pull:en:1"}
157
+ {"text": "gpio monitorring rok do", "action": "gpio_stop_watch", "target": "gpio_stop_watch", "target_raw": "gpio_stop_watch", "device": "pi", "risk": "safe", "group": "G6:gpio_stop_watch:hi:6"}
158
+ {"text": "movie dekhni hai, flip gpio pin 16", "action": "gpio_toggle", "target": "gpio_toggle pin=16", "target_raw": "gpio_toggle pin=16", "device": "pi", "risk": "caution", "group": "G:gpio_toggle:en:2"}
159
+ {"text": "can you monitor the red led on gpio 25, call pe hoon", "action": "gpio_watch", "target": "gpio_watch pin=25", "target_raw": "gpio_watch pin=25", "device": "pi", "risk": "safe", "group": "G7:para:g6:gpio_watch:en:5:0"}
160
+ {"text": "jara i want to disable ssh password login", "action": "harden_ssh", "target": "harden_ssh", "target_raw": "harden_ssh", "device": "both", "risk": "critical", "group": "G7:para:g3:harden_ssh:en:1:0"}
161
+ {"text": "invoice.png hash karo", "action": "hash_file", "target": "hash_file path=\"invoice.png\"", "target_raw": "hash_file path=\"invoice.png\"", "device": "both", "risk": "safe", "group": "G5:fileop:hash_file:7"}
162
+ {"text": "please how can you help me pls", "action": "help", "target": "help", "target_raw": "help", "device": "both", "risk": "safe", "group": "G:help:en:4"}
163
+ {"text": "kindly ab laptop hibernation mein bhej do zara", "action": "hibernate", "target": "hibernate", "target_raw": "hibernate", "device": "both", "risk": "critical", "group": "A:hibernate/test/1"}
164
+ {"text": "could you please high contrast mode hata dijiye quickly", "action": "high_contrast_off", "target": "high_contrast_off", "target_raw": "high_contrast_off", "device": "both", "risk": "safe", "group": "G7:para:g:high_contrast_off:hi:1:1"}
165
+ {"text": "computer could you enable high contrast mode, aankh dukh rahi hai", "action": "high_contrast_on", "target": "high_contrast_on", "target_raw": "high_contrast_on", "device": "both", "risk": "safe", "group": "G7:para:g:high_contrast_on:en:1:1"}
166
+ {"text": "stop sharing internet thank you", "action": "hotspot_off", "target": "hotspot_off", "target_raw": "hotspot_off", "device": "both", "risk": "safe", "group": "B:hotspot_off:en:3"}
167
+ {"text": "i am done for today, hotspot on karo naam Lalit_Home password Hello$wifi na", "action": "hotspot_on", "target": "hotspot_on ssid=\"lalit_home\" password=\"hello$wifi\"", "target_raw": "hotspot_on ssid=\"Lalit_Home\" password=\"Hello$wifi\"", "device": "both", "risk": "safe", "group": "G4:hotspot_on:0"}
168
+ {"text": "can you i2cdump 0x48 fast", "action": "i2c_dump", "target": "i2c_dump address=\"0x48\"", "target_raw": "i2c_dump address=\"0x48\"", "device": "pi", "risk": "safe", "group": "G7:para:g6:i2c_dump:en:1:2"}
169
+ {"text": "i2c 0x1e se register 0x3b padho please quickly", "action": "i2c_read", "target": "i2c_read address=\"0x1e\" register=\"0x3b\"", "target_raw": "i2c_read address=\"0x1e\" register=\"0x3b\"", "device": "pi", "risk": "safe", "group": "G7:para:g6:i2c_read:hi:0:1"}
170
+ {"text": "please jaldi can you scan i2c bus", "action": "i2c_scan", "target": "i2c_scan", "target_raw": "i2c_scan", "device": "pi", "risk": "safe", "group": "G7:para:g:i2c_scan:en:0:1"}
171
+ {"text": "i2cset 0x68 0xf7 0x01 abhi ke abhi", "action": "i2c_write", "target": "i2c_write address=\"0x68\" register=\"0xf7\" value=1", "target_raw": "i2c_write address=\"0x68\" register=\"0xf7\" value=1", "device": "pi", "risk": "critical", "group": "G6:i2c_write:en:1"}
172
+ {"text": "private wkndow open karo quickly pi 5 pe", "action": "incognito_window", "target": "incognito_window", "target_raw": "incognito_window", "device": "both", "risk": "safe", "group": "G8:dev:G:incognito_window:hi:1"}
173
+ {"text": "can you mujhe build-essential chahiye install kar dijiye", "action": "install_package", "target": "install_package name=\"build-essential\"", "target_raw": "install_package name=\"build-essential\"", "device": "both", "risk": "caution", "group": "G7:para:g3:install_package:hi:5:1"}
174
+ {"text": "torch module laga do, bahut der ho gayi", "action": "install_python_package", "target": "install_python_package name=\"torch\"", "target_raw": "install_python_package name=\"torch\"", "device": "both", "risk": "caution", "group": "G7:con:install_python_package:0"}
175
+ {"text": "raat ho gayi hai toh os update install kr", "action": "install_updates", "target": "install_updates", "target_raw": "install_updates", "device": "both", "risk": "critical", "group": "B:install_updates:hi:7"}
176
+ {"text": "can you disable i2c right now", "action": "interface_disable", "target": "interface_disable interface=i2c", "target_raw": "interface_disable interface=i2c", "device": "pi", "risk": "critical", "group": "G7:para:g:interface_disable:en:1:0"}
177
+ {"text": "please raspberry mein i2c chalu kar dena kar sakte ho", "action": "interface_enable", "target": "interface_enable interface=i2c", "target_raw": "interface_enable interface=i2c", "device": "pi", "risk": "critical", "group": "A:enable_i2c/test/1"}
178
+ {"text": "mere liye please end the running process id 4261 for me", "action": "kill_process", "target": "kill_process pid=4261", "target_raw": "kill_process pid=4261", "device": "both", "risk": "critical", "group": "A:kill_process/test/0"}
179
+ {"text": "ok google ds18b20 sensor display karo", "action": "list_1wire_sensors", "target": "list_1wire_sensors", "target_raw": "list_1wire_sensors", "device": "pi", "risk": "safe", "group": "G7:para:g2:list_1wire_sensors:hi:1:0"}
180
+ {"text": "arp table display karo, khana khane ja raha hoon", "action": "list_arp", "target": "list_arp", "target_raw": "list_arp", "device": "both", "risk": "safe", "group": "G7:para:g2:list_arp:hi:0:0"}
181
+ {"text": "jara mic aur speaker devices show kar", "action": "list_audio_devices", "target": "list_audio_devices", "target_raw": "list_audio_devices", "device": "both", "risk": "safe", "group": "G7:para:g2:list_audio_devices:hi:2:2"}
182
+ {"text": "kitne ip ban hain turant", "action": "list_banned_ips", "target": "list_banned_ips", "target_raw": "list_banned_ips", "device": "both", "risk": "safe", "group": "G7:con:list_banned_ips:5"}
183
+ {"text": "jaldi se bluetooth devices dikhao", "action": "list_bluetooth_devices", "target": "list_bluetooth_devices", "target_raw": "list_bluetooth_devices", "device": "both", "risk": "safe", "group": "G7:para:g:list_bluetooth_devices:hi:0:1"}
184
+ {"text": "mere liye please show connected pi cameras zara", "action": "list_cameras", "target": "list_cameras", "target_raw": "list_cameras", "device": "pi", "risk": "safe", "group": "A:list_cameras/test/0"}
185
+ {"text": "please network ki active connections bata dena na", "action": "list_connections", "target": "list_connections", "target_raw": "list_connections", "device": "both", "risk": "safe", "group": "A:show_connections/test/1"}
186
+ {"text": "zara please show attached drives and partitions na", "action": "list_partitions", "target": "list_partitions", "target_raw": "list_partitions", "device": "both", "risk": "safe", "group": "A:list_disks/test/0"}
187
+ {"text": "kaunse monitor lage hain zara, battery bachani hai", "action": "list_displays", "target": "list_displays", "target_raw": "list_displays", "device": "both", "risk": "safe", "group": "G7:para:g2:list_displays:hi:1:2"}
188
+ {"text": "i need to which services have failed pls", "action": "list_failed_services", "target": "list_failed_services", "target_raw": "list_failed_services", "device": "both", "risk": "safe", "group": "G7:para:g2:list_failed_services:en:1:1"}
189
+ {"text": "please photos list karo", "action": "list_files", "target": "list_files path=\"photos\"", "target_raw": "list_files path=\"photos\"", "device": "both", "risk": "safe", "group": "G5:fileop:list_files:8"}
190
+ {"text": "windows 11 ki bhai unused pins show kar!", "action": "list_free_gpio", "target": "list_free_gpio", "target_raw": "list_free_gpio", "device": "pi", "risk": "safe", "group": "G8:dev:G7:para:g6:list_free_gpio:hi:3:0"}
191
+ {"text": "windows 11 ki gpio status dikhao asap", "action": "list_gpio", "target": "list_gpio", "target_raw": "list_gpio", "device": "pi", "risk": "safe", "group": "G8:dev:G2:list_gpio:hi:41"}
192
+ {"text": "on windows 11, suno what is the header chip number", "action": "list_gpio_chips", "target": "list_gpio_chips", "target_raw": "list_gpio_chips", "device": "pi", "risk": "safe", "group": "G8:dev:G6:list_gpio_chips:en:4"}
193
+ {"text": "raspberry pi 5 pe pi list instaled apps for me", "action": "list_installed_apps", "target": "list_installed_apps", "target_raw": "list_installed_apps", "device": "both", "risk": "safe", "group": "G8:dev:G:list_installed_apps:en:0"}
194
+ {"text": "kaunse drivers loaded hain ji on the rpi 5", "action": "list_kernel_modules", "target": "list_kernel_modules", "target_raw": "list_kernel_modules", "device": "both", "risk": "safe", "group": "G8:dev:G2:list_kernel_modules:hi:22"}
195
+ {"text": "could you ollama list, baccha ro raha hai", "action": "list_llm_models", "target": "list_llm_models", "target_raw": "list_llm_models", "device": "both", "risk": "safe", "group": "G7:para:g3:list_llm_models:en:2:2"}
196
+ {"text": "mere pi 5 me kurrent sessions show kar jaldi for me", "action": "list_logged_in_users", "target": "list_logged_in_users", "target_raw": "list_logged_in_users", "device": "both", "risk": "safe", "group": "G8:dev:G7:para:g2:list_logged_in_users:hi:2:1"}
197
+ {"text": "on windows 11 main bahar ja raha hoon toh open filex dikhao usb drive", "action": "list_open_files", "target": "list_open_files device=\"usb drive\"", "target_raw": "list_open_files device=\"usb drive\"", "device": "both", "risk": "safe", "group": "G8:dev:G5:syn:list_open_files:5"}
198
+ {"text": "computer please what's listening on ports", "action": "list_open_ports", "target": "list_open_ports", "target_raw": "list_open_ports", "device": "both", "risk": "safe", "group": "G7:para:g2:list_open_ports:en:2:0"}
199
+ {"text": "rpi5 pe can you what pcakages are installed", "action": "list_packages", "target": "list_packages", "target_raw": "list_packages", "device": "both", "risk": "safe", "group": "G8:dev:G7:para:g3:list_packages:en:1:0"}
200
+ {"text": "bachche so rahe hain, can you list block devices turant", "action": "list_partitions", "target": "list_partitions", "target_raw": "list_partitions", "device": "both", "risk": "safe", "group": "G7:para:g2:list_partitions:en:3:0"}
201
+ {"text": "bhai pi ke saare pcie devices bata dena", "action": "list_pci", "target": "list_pci", "target_raw": "list_pci", "device": "pi", "risk": "safe", "group": "A:list_pci/test/1"}
202
+ {"text": "on my raspberry pi 5 bahut der ho gayi, which printers are available", "action": "list_printers", "target": "list_printers", "target_raw": "list_printers", "device": "both", "risk": "safe", "group": "G8:dev:G5:new:list_printers:1"}
203
+ {"text": "kindly system ki running process list bata dena for me", "action": "list_processes", "target": "list_processes", "target_raw": "list_processes", "device": "both", "risk": "safe", "group": "A:show_processes/test/1"}
204
+ {"text": "uart ports dikhao, bahut der ho gayi", "action": "list_serial_ports", "target": "list_serial_ports", "target_raw": "list_serial_ports", "device": "pi", "risk": "safe", "group": "G2:list_serial_ports:hi:70"}
205
+ {"text": "saari system services ki list bata dena zara", "action": "list_services", "target": "list_services", "target_raw": "list_services", "device": "both", "risk": "safe", "group": "A:list_services/test/1"}
206
+ {"text": "tmux ls.", "action": "list_sessions", "target": "list_sessions", "target_raw": "list_sessions", "device": "both", "risk": "safe", "group": "G3:list_sessions:en:41"}
207
+ {"text": "movie dekhni hai so spi enable hai kya, main so raha hoon", "action": "list_spi_devices", "target": "list_spi_devices", "target_raw": "list_spi_devices", "device": "pi", "risk": "safe", "group": "G2:list_spi_devices:hi:44"}
208
+ {"text": "HEY COMPUTER PLEASE SHOW CONNECTED USB DEVICES NA", "action": "list_usb", "target": "list_usb", "target_raw": "list_usb", "device": "pi", "risk": "safe", "group": "A:list_usb/test/0"}
209
+ {"text": "net chal raha he kya nahi karna, sirf list wifi networks", "action": "list_wifi", "target": "list_wifi", "target_raw": "list_wifi", "device": "both", "risk": "safe", "group": "B:contrast:list_wifi"}
210
+ {"text": "disable-bt overlay load kar dijiye", "action": "load_overlay", "target": "load_overlay overlay=\"disable-bt\"", "target_raw": "load_overlay overlay=\"disable-bt\"", "device": "pi", "risk": "caution", "group": "G7:para:g3:load_overlay:hi:0:0"}
211
+ {"text": "CAN YOU AB SCREEN KO LOCK KAR DENA PLEASE", "action": "lock_screen", "target": "lock_screen", "target_raw": "lock_screen", "device": "both", "risk": "caution", "group": "A:lock_screen/test/1"}
212
+ {"text": "the mgnifier close thank you", "action": "magnifier_off", "target": "magnifier_off", "target_raw": "magnifier_off", "device": "both", "risk": "safe", "group": "G5:pol:magnifier_off:1:1"}
213
+ {"text": "on windows 11, not exit zoom lens, screen magnifier chalu karo pls", "action": "magnifier_on", "target": "magnifier_on", "target_raw": "magnifier_on", "device": "both", "risk": "safe", "group": "G8:dev:B:contrast:magnifier_on"}
214
+ {"text": "can you create a user pi2", "action": "manage_users", "target": "manage_users user=\"pi2\"", "target_raw": "manage_users user=\"pi2\"", "device": "both", "risk": "critical", "group": "G3:manage_users:en:27"}
215
+ {"text": "pi5 me yaar ye window maximize kar dena but teams ki window band mat karo", "action": "maximize_window", "target": "maximize_window", "target_raw": "maximize_window", "device": "both", "risk": "safe", "group": "G8:dev:B:contrast:maximize_window"}
216
+ {"text": "guest aaye hain, next song", "action": "media_next", "target": "media_next", "target_raw": "media_next", "device": "both", "risk": "safe", "group": "B:media_next:en:0"}
217
+ {"text": "KINDLY ABHI MUSIC PAUSE KAR DENA KAR SAKTE HO", "action": "media_pause", "target": "media_pause", "target_raw": "media_pause", "device": "both", "risk": "safe", "group": "A:media_play_pause/test/1"}
218
+ {"text": "could you please gaana bajao", "action": "media_play", "target": "media_play", "target_raw": "media_play", "device": "both", "risk": "safe", "group": "B:media_play:hi:9"}
219
+ {"text": "please toggle media playback kar sakte ho", "action": "media_play_pause", "target": "media_play_pause", "target_raw": "media_play_pause", "device": "both", "risk": "safe", "group": "A:media_play_pause/test/0"}
220
+ {"text": "zara please return to the previous media track abhi", "action": "media_prev", "target": "media_prev", "target_raw": "media_prev", "device": "both", "risk": "safe", "group": "A:media_previous/test/0"}
221
+ {"text": "microphone band kijiye abhi ke abhi", "action": "mic_mute", "target": "mic_mute", "target_raw": "mic_mute", "device": "both", "risk": "safe", "group": "G5:para:g:mic_mute:hi:1:1"}
222
+ {"text": "microphone chalu karna kaam ho gaya", "action": "mic_unmute", "target": "mic_unmute", "target_raw": "mic_unmute", "device": "both", "risk": "safe", "group": "G5:para:g:mic_unmute:hi:1:1"}
223
+ {"text": "this window minimize kar dijiye", "action": "minimize_window", "target": "minimize_window", "target_raw": "minimize_window", "device": "both", "risk": "safe", "group": "B:minimize_window:hi:0"}
224
+ {"text": "live health dikhate raho zara, kal milte hain", "action": "monitor_health", "target": "monitor_health", "target_raw": "monitor_health", "device": "both", "risk": "safe", "group": "G7:para:g3:monitor_health:hi:2:2"}
225
+ {"text": "udew events watch kar mere windows 11 pe", "action": "monitor_hotplug", "target": "monitor_hotplug", "target_raw": "monitor_hotplug", "device": "both", "risk": "safe", "group": "G8:dev:G7:para:g3:monitor_hotplug:hi:1:1"}
226
+ {"text": "ssd lagao", "action": "mount_drive", "target": "mount_drive device=\"ssd\"", "target_raw": "mount_drive device=\"ssd\"", "device": "both", "risk": "caution", "group": "G5:pol:mount_drive:0:3"}
227
+ {"text": "zara \"demo/old19.txt\" se \"demo/new9.txt\" tak file move kar dena zara", "action": "move_file", "target": "move_file src=\"demo/old19.txt\" dst=\"demo/new9.txt\"", "target_raw": "move_file src=\"demo/old19.txt\" dst=\"demo/new9.txt\"", "device": "both", "risk": "caution", "group": "A:move_file/test/1"}
228
+ {"text": "suno switch off sound", "action": "mute", "target": "mute", "target_raw": "mute", "device": "both", "risk": "safe", "group": "B:mute:en:12"}
229
+ {"text": "computer narrator band karo", "action": "narrator_off", "target": "narrator_off", "target_raw": "narrator_off", "device": "both", "risk": "safe", "group": "G5:pol:narrator_off:0:3"}
230
+ {"text": "hi narrator on kro", "action": "narrator_on", "target": "narrator_on", "target_raw": "narrator_on", "device": "both", "risk": "safe", "group": "G5:pol:narrator_on:0:2"}
231
+ {"text": "jaldi se am i connected to internet ji", "action": "network_status", "target": "network_status", "target_raw": "network_status", "device": "both", "risk": "safe", "group": "B:network_status:en:7"}
232
+ {"text": "mere liye another tab", "action": "new_tab", "target": "new_tab", "target_raw": "new_tab", "device": "both", "risk": "safe", "group": "B:new_tab:en:2"}
233
+ {"text": "sun naya virtual desktop open kar", "action": "new_virtual_desktop", "target": "new_virtual_desktop", "target_raw": "new_virtual_desktop", "device": "both", "risk": "safe", "group": "G7:para:g:new_virtual_desktop:hi:0:2"}
234
+ {"text": "laptop agla tab kholna bahut der ho gayi", "action": "next_tab", "target": "next_tab", "target_raw": "next_tab", "device": "both", "risk": "safe", "group": "G5:para:g:next_tab:hi:0:2"}
235
+ {"text": "disable night mode kyunki neend aa rahi hai", "action": "night_light_off", "target": "night_light_off", "target_raw": "night_light_off", "device": "both", "risk": "safe", "group": "B:night_light_off:en:2"}
236
+ {"text": "eye protection on kro", "action": "night_light_on", "target": "night_light_on", "target_raw": "night_light_on", "device": "both", "risk": "safe", "group": "G5:pol:night_light_on:2:2"}
237
+ {"text": "mujhe kaam karna hai osk chahiye", "action": "onscreen_keyboard", "target": "onscreen_keyboard", "target_raw": "onscreen_keyboard", "device": "both", "risk": "safe", "group": "B:onscreen_keyboard:hi:2"}
238
+ {"text": "please please launch windows disk management", "action": "open_app", "target": "open_app app=disk_management", "target_raw": "open_app app=disk_management", "device": "both", "risk": "caution", "group": "A:open_disk_manager/test/0"}
239
+ {"text": "sun raspi-config open kar turant", "action": "open_config_tool", "target": "open_config_tool", "target_raw": "open_config_tool", "device": "pi", "risk": "caution", "group": "G7:para:g3:open_config_tool:hi:0:2"}
240
+ {"text": "ok google youngick_.mp4 wali file dikhana bhai", "action": "open_file", "target": "open_file path=\"youngick_.mp4\"", "target_raw": "open_file path=\"youngick_.mp4\"", "device": "both", "risk": "safe", "group": "G7:para:g:open_file:hi:1:2"}
241
+ {"text": "ji take me to dsktop folder windows 11 pe", "action": "open_folder", "target": "open_folder folder=desktop", "target_raw": "open_folder folder=desktop", "device": "both", "risk": "safe", "group": "G8:dev:B:open_folder:en:4"}
242
+ {"text": "bring up the notification panel", "action": "open_notification_center", "target": "open_notification_center", "target_raw": "open_notification_center", "device": "both", "risk": "safe", "group": "G5:para:g:open_notification_center:en:0:0"}
243
+ {"text": "windows 11 ki rekycle bin folder open kar do yaa", "action": "open_recycle_bin", "target": "open_recycle_bin", "target_raw": "open_recycle_bin", "device": "both", "risk": "safe", "group": "G8:dev:B:open_recycle_bin:hi:0"}
244
+ {"text": "could you open a serial terminal on /dev/ttyAMA0 na", "action": "open_serial_terminal", "target": "open_serial_terminal serial_port=\"/dev/ttyama0\"", "target_raw": "open_serial_terminal serial_port=\"/dev/ttyAMA0\"", "device": "pi", "risk": "caution", "group": "G7:para:g3:open_serial_terminal:en:0:2"}
245
+ {"text": "can you mere system ki settings khol do zara", "action": "open_settings", "target": "open_settings", "target_raw": "open_settings", "device": "both", "risk": "safe", "group": "A:open_settings/test/1"}
246
+ {"text": "ji tweeter chalao", "action": "open_site", "target": "open_site site=twitter", "target_raw": "open_site site=twitter", "device": "both", "risk": "safe", "group": "B:open_site:hi:10"}
247
+ {"text": "visit player.dev windows 11 pe", "action": "open_url", "target": "open_url url=\"player.dev\"", "target_raw": "open_url url=\"player.dev\"", "device": "both", "risk": "safe", "group": "G8:dev:B:open_url:en:2"}
248
+ {"text": "traffic sniff kijiye ji", "action": "packet_capture", "target": "packet_capture", "target_raw": "packet_capture", "device": "both", "risk": "caution", "group": "G5:para:g3:packet_capture:hi:2:0"}
249
+ {"text": "pi 5 pe can you format sda1", "action": "partition_disk", "target": "partition_disk device=\"sda1\"", "target_raw": "partition_disk device=\"sda1\"", "device": "both", "risk": "critical", "group": "G8:dev:G7:para:g3:partition_disk:en:3:1"}
250
+ {"text": "cgrl v fast redo kr nahi", "action": "paste", "target": "paste", "target_raw": "paste", "device": "both", "risk": "safe", "group": "B:contrast:paste"}
251
+ {"text": "zara raspberrypi.local ki network reachability check karo kar sakte ho", "action": "ping", "target": "ping host=\"raspberrypi.local\"", "target_raw": "ping host=\"raspberrypi.local\"", "device": "both", "risk": "safe", "group": "A:ping_host/test/1"}
252
+ {"text": "could you please ssh tunnel port 80 to github.com", "action": "port_forward", "target": "port_forward port=80 host=\"github.com\"", "target_raw": "port_forward port=80 host=\"github.com\"", "device": "both", "risk": "caution", "group": "G7:para:g3:port_forward:en:1:0"}
253
+ {"text": "windows 11 pe poower plan perormance pe rakho", "action": "power_mode", "target": "power_mode mode=performance", "target_raw": "power_mode mode=performance", "device": "both", "risk": "caution", "group": "G8:dev:G5:para:g:power_mode:hi:2:0"}
254
+ {"text": "pi5 me bhaiya esc press kijiye ji", "action": "press_key", "target": "press_key key=escape", "target_raw": "press_key key=escape", "device": "both", "risk": "caution", "group": "G8:dev:G5:para:g:press_key:hi:0:0"}
255
+ {"text": "hi pichla tab dikha do", "action": "prev_tab", "target": "prev_tab", "target_raw": "prev_tab", "device": "both", "risk": "safe", "group": "G5:para:g:prev_tab:hi:0:1"}
256
+ {"text": "photo.jpg print karo, i'll be back", "action": "print_file", "target": "print_file path=\"photo.jpg\"", "target_raw": "print_file path=\"photo.jpg\"", "device": "both", "risk": "caution", "group": "G5:new:print_file:4"}
257
+ {"text": "online class hai toh is page print kro", "action": "print_page", "target": "print_page", "target_raw": "print_page", "device": "both", "risk": "safe", "group": "G5:para:g:print_page:hi:0:2"}
258
+ {"text": "llama3.2 pull kar dijiyega", "action": "pull_llm_model", "target": "pull_llm_model model=\"llama3.2\"", "target_raw": "pull_llm_model model=\"llama3.2\"", "device": "both", "risk": "caution", "group": "G7:para:g3:pull_llm_model:hi:1:0"}
259
+ {"text": "is windows 11 pc pe bhai get the text contents \"work/report18.txt\"", "action": "read_file", "target": "read_file path=\"work/report18.txt\"", "target_raw": "read_file path=\"work/report18.txt\"", "device": "both", "risk": "caution", "group": "G8:dev:A:read_file/enriched/3"}
260
+ {"text": "recent files dikhana quickly", "action": "recent_files", "target": "recent_files", "target_raw": "recent_files", "device": "both", "risk": "safe", "group": "G5:para:g:recent_files:hi:0:2"}
261
+ {"text": "mic se 5 minton record karke display karo zara", "action": "record_audio", "target": "record_audio amount=5 unit=min", "target_raw": "record_audio amount=5 unit=min", "device": "both", "risk": "safe", "group": "G7:para:g2:record_audio:hi:1:0"}
262
+ {"text": "jara redo", "action": "redo", "target": "redo", "target_raw": "redo", "device": "both", "risk": "safe", "group": "B:redo:en:0"}
263
+ {"text": "windows 11 pe bahut der ho gayi refresh kr fast", "action": "refresh", "target": "refresh", "target_raw": "refresh", "device": "both", "risk": "safe", "group": "G8:dev:B:refresh:hi:6"}
264
+ {"text": "ssh tester@192.168.1.50 bhai", "action": "remote_shell", "target": "remote_shell host=\"192.168.1.50\" user=\"tester\"", "target_raw": "remote_shell host=\"192.168.1.50\" user=\"tester\"", "device": "both", "risk": "caution", "group": "G3:remote_shell:en:28"}
265
+ {"text": "rpi 5 pe could you rename file \"work/old10.txt\" to \"work/new9.txt\" zara", "action": "rename_file", "target": "rename_file src=\"work/old10.txt\" dst=\"work/new9.txt\"", "target_raw": "rename_file src=\"work/old10.txt\" dst=\"work/new9.txt\"", "device": "both", "risk": "caution", "group": "G8:dev:A:rename_file/train/0"}
266
+ {"text": "is windows 11 pc pe hey reopen the last tab", "action": "reopen_tab", "target": "reopen_tab", "target_raw": "reopen_tab", "device": "both", "risk": "safe", "group": "G8:dev:B:reopen_tab:en:0"}
267
+ {"text": "bachche so rahe hain, package state repair karo bhai", "action": "repair_packages", "target": "repair_packages", "target_raw": "repair_packages", "device": "both", "risk": "caution", "group": "G7:para:g3:repair_packages:hi:1:1"}
268
+ {"text": "ok laptop can you launch previous command again, i'll be back", "action": "repeat_last", "target": "repeat_last", "target_raw": "repeat_last", "device": "both", "risk": "safe", "group": "G7:para:g:repeat_last:en:1:0"}
269
+ {"text": "raspberry pi 5 pe mere liye midnight baje restart karna bhhai plz", "action": "restart", "target": "restart at=00:00", "target_raw": "restart at=00:00", "device": "both", "risk": "critical", "group": "G8:dev:G7:para:g:restart@:hi:0:1"}
270
+ {"text": "could you rotate the screen to horizontal turant", "action": "rotate_screen", "target": "rotate_screen orientation=landscape", "target_raw": "rotate_screen orientation=landscape", "device": "both", "risk": "safe", "group": "G7:para:g:rotate_screen:en:0:0"}
271
+ {"text": "is windows 11 pc pe yaar start free -h detached", "action": "run_background", "target": "run_background command=\"free -h\"", "target_raw": "run_background command=\"free -h\"", "device": "both", "risk": "critical", "group": "G8:dev:G3:run_background:en:31"}
272
+ {"text": "run a cpu benchmark", "action": "run_benchmark", "target": "run_benchmark target=cpu", "target_raw": "run_benchmark target=cpu", "device": "both", "risk": "caution", "group": "G2:run_benchmark:en:52"}
273
+ {"text": "kindly ./llama-cli -m model.gguf start karo", "action": "run_command", "target": "run_command command=\"./llama-cli -m model.gguf\"", "target_raw": "run_command command=\"./llama-cli -m model.gguf\"", "device": "both", "risk": "critical", "group": "G5:para:g3:run_command:hi:0:0"}
274
+ {"text": "boss ollama launch deepseek-r1:1.5b", "action": "run_llm", "target": "run_llm model=\"deepseek-r1:1.5b\"", "target_raw": "run_llm model=\"deepseek-r1:1.5b\"", "device": "both", "risk": "caution", "group": "G7:para:g3:run_llm:en:1:2"}
275
+ {"text": "hey pi gemma3:1b ki tok/s bata do", "action": "run_llm_benchmark", "target": "run_llm_benchmark model=\"gemma3:1b\"", "target_raw": "run_llm_benchmark model=\"gemma3:1b\"", "device": "both", "risk": "safe", "group": "G5:para:g3:run_llm_benchmark:hi:1:2"}
276
+ {"text": "could you benchmark network to nas.local", "action": "run_network_benchmark", "target": "run_network_benchmark host=\"nas.local\"", "target_raw": "run_network_benchmark host=\"nas.local\"", "device": "both", "risk": "caution", "group": "G7:para:g3:run_network_benchmark:en:1:2"}
277
+ {"text": "zara arbitrary srcipt execute karna abhi pi 5 pe", "action": "run_script", "target": "run_script", "target_raw": "run_script", "device": "both", "risk": "critical", "group": "G8:dev:A:run_script/practical/0"}
278
+ {"text": "hey run a stress test for ten minute", "action": "run_stress_test", "target": "run_stress_test amount=10 unit=min", "target_raw": "run_stress_test amount=10 unit=min", "device": "both", "risk": "caution", "group": "G2:run_stress_test:en:76"}
279
+ {"text": "on windows 11 isko save karo main so raha hoon fqst", "action": "save_file", "target": "save_file", "target_raw": "save_file", "device": "both", "risk": "safe", "group": "G8:dev:B:save_file:hi:2"}
280
+ {"text": "hey assistant saare connected devices dhundo for me", "action": "discover_devices", "target": "discover_devices", "target_raw": "discover_devices", "device": "both", "risk": "safe", "group": "G7:con:scan_lan:3"}
281
+ {"text": "192.168.0.10 ke ports scan kar right now", "action": "scan_ports", "target": "scan_ports host=\"192.168.0.10\"", "target_raw": "scan_ports host=\"192.168.0.10\"", "device": "both", "risk": "caution", "group": "G7:para:g3:scan_ports:hi:0:1"}
282
+ {"text": "on win 11 boss i need to add a cron job to launch ./deploy.sh daily jaldi", "action": "schedule_task", "target": "schedule_task command=\"./deploy.sh\" schedule=\"daily\"", "target_raw": "schedule_task command=\"./deploy.sh\" schedule=\"daily\"", "device": "both", "risk": "critical", "group": "G8:dev:G7:para:g3:schedule_task:en:2:0"}
283
+ {"text": "on my raspberry pi 5 display ko band karo", "action": "screen_off", "target": "screen_off", "target_raw": "screen_off", "device": "both", "risk": "safe", "group": "G8:dev:B:screen_off:hi:3"}
284
+ {"text": "i want to start recording the screen please", "action": "screen_record_start", "target": "screen_record_start", "target_raw": "screen_record_start", "device": "both", "risk": "safe", "group": "G7:para:g:screen_record_start:en:2:0"}
285
+ {"text": "guest aaye hain so recording band kar dena pls", "action": "screen_record_stop", "target": "screen_record_stop", "target_raw": "screen_record_stop", "device": "both", "risk": "safe", "group": "G7:para:g:screen_record_stop:hi:0:2"}
286
+ {"text": "zave a screen shot jali disk full nahi", "action": "screenshot", "target": "screenshot", "target_raw": "screenshot", "device": "both", "risk": "safe", "group": "B:contrast:screenshot"}
287
+ {"text": "raat ho gayi hai, thoda neeche kar dijiye bhai yaar", "action": "scroll_down", "target": "scroll_down", "target_raw": "scroll_down", "device": "both", "risk": "safe", "group": "G7:para:g:scroll_down:hi:2:2"}
288
+ {"text": "please jaldi scroll up", "action": "scroll_up", "target": "scroll_up", "target_raw": "scroll_up", "device": "both", "risk": "safe", "group": "G:scroll_up:en:0"}
289
+ {"text": "mere windows 11 laptop pe search files for gulab jamun recipe", "action": "search_files", "target": "search_files query=\"gulab jamun recipe\"", "target_raw": "search_files query=\"gulab jamun recipe\"", "device": "both", "risk": "safe", "group": "G8:dev:G5:syn:search_files:1"}
290
+ {"text": "find the text ipl score inside files", "action": "search_in_files", "target": "search_in_files query=\"ipl score\"", "target_raw": "search_in_files query=\"ipl score\"", "device": "both", "risk": "safe", "group": "G5:syn:search_in_files:1"}
291
+ {"text": "stress-ng package search karo", "action": "search_package", "target": "search_package name=\"stress-ng\"", "target_raw": "search_package name=\"stress-ng\"", "device": "both", "risk": "safe", "group": "G3:search_package:hi:62"}
292
+ {"text": "raspberry pi 5 ki computer select all text", "action": "select_all", "target": "select_all", "target_raw": "select_all", "device": "both", "risk": "safe", "group": "G8:dev:B:select_all:en:4"}
293
+ {"text": "priya.s@outlook.com ko email karo ki aaj wfh hai on windows 11", "action": "send_email", "target": "send_email to=\"priya.s@outlook.com\" text=\"aaj wfh hai\"", "target_raw": "send_email to=\"priya.s@outlook.com\" text=\"aaj wfh hai\"", "device": "both", "risk": "caution", "group": "G8:dev:G5:new:send_email:6"}
294
+ {"text": "ji send a msg to priya on teams saying pls call", "action": "send_message", "target": "send_message app=teams contact=\"priya\" text=\"pls call\"", "target_raw": "send_message app=teams contact=\"priya\" text=\"pls call\"", "device": "both", "risk": "caution", "group": "G5:new:send_message:0"}
295
+ {"text": "zara please disable the pi ssh server kar sakte ho", "action": "service_disable", "target": "service_disable service=ssh", "target_raw": "service_disable service=ssh", "device": "both", "risk": "critical", "group": "A:disable_ssh/test/0"}
296
+ {"text": "mere liye please enable the pi ssh server zara", "action": "service_enable", "target": "service_enable service=ssh", "target_raw": "service_enable service=ssh", "device": "both", "risk": "critical", "group": "A:enable_ssh/test/0"}
297
+ {"text": "please \"Spooler\" service ko phir start kar dena thanks", "action": "service_restart", "target": "service_restart service=spooler", "target_raw": "service_restart service=spooler", "device": "both", "risk": "critical", "group": "A:service_restart/test/1"}
298
+ {"text": "please start the system service \"cron\" zara", "action": "service_start", "target": "service_start service=cron", "target_raw": "service_start service=cron", "device": "both", "risk": "critical", "group": "A:service_start/test/0"}
299
+ {"text": "\"Spooler\" service ki current state bata dena thanks", "action": "service_status", "target": "service_status service=spooler", "target_raw": "service_status service=spooler", "device": "both", "risk": "safe", "group": "A:service_status/test/1"}
300
+ {"text": "PLEASE STOP THE SYSTEM SERVICE \"W32TIME\" ZARA", "action": "service_stop", "target": "service_stop service=w32time", "target_raw": "service_stop service=w32time", "device": "both", "risk": "critical", "group": "A:service_stop/test/0"}
301
+ {"text": "i am done for today so subah saade chhhe baje ke liye alarm laga do bhai", "action": "set_alarm", "target": "set_alarm time=06:30", "target_raw": "set_alarm time=06:30", "device": "both", "risk": "safe", "group": "G5:para:g:set_alarm:hi:0:0"}
302
+ {"text": "आवाज़ ब्लूटूथ से कीजिए.", "action": "set_audio_output", "target": "set_audio_output output=bluetooth", "target_raw": "set_audio_output output=bluetooth", "device": "both", "risk": "safe", "group": "G5:para:g:set_audio_output:hi:0:1"}
303
+ {"text": "set boot order to sd card abhi ke abhi", "action": "set_boot_order", "target": "set_boot_order order=\"sd card\"", "target_raw": "set_boot_order order=\"sd card\"", "device": "pi", "risk": "critical", "group": "G3:set_boot_order:en:84"}
304
+ {"text": "on windows 11, laptop change boot target to graphical", "action": "set_boot_target", "target": "set_boot_target target=graphical", "target_raw": "set_boot_target target=graphical", "device": "both", "risk": "caution", "group": "G8:dev:G7:para:g2:set_boot_target:en:1:0"}
305
+ {"text": "could you brightness please 38 kar dena", "action": "set_brightness", "target": "set_brightness value=38", "target_raw": "set_brightness value=38", "device": "both", "risk": "caution", "group": "A:set_brightness/test/1"}
306
+ {"text": "taskmake 4521 to 3", "action": "set_cpu_affinity", "target": "set_cpu_affinity pid=4521 cores=\"3\"", "target_raw": "set_cpu_affinity pid=4521 cores=\"3\"", "device": "both", "risk": "caution", "group": "G5:para:g3:set_cpu_affinity:en:2:0"}
307
+ {"text": "jaldi se cpu governor conservative pe rakho", "action": "set_cpu_governor", "target": "set_cpu_governor governor=conservative", "target_raw": "set_cpu_governor governor=conservative", "device": "pi", "risk": "caution", "group": "G5:para:g2:set_cpu_governor:hi:0:0"}
308
+ {"text": "pi 5 pe default preenter epson l3150 ralho ji", "action": "set_default_printer", "target": "set_default_printer name=\"epson l3150\"", "target_raw": "set_default_printer name=\"epson l3150\"", "device": "both", "risk": "safe", "group": "G8:dev:G5:new:set_default_printer:4"}
309
+ {"text": "nvme0n1 ka label backup rakho pls", "action": "set_disk_label", "target": "set_disk_label device=\"nvme0n1\" label=\"backup\"", "target_raw": "set_disk_label device=\"nvme0n1\" label=\"backup\"", "device": "both", "risk": "caution", "group": "G3:set_disk_label:hi:31"}
310
+ {"text": "on win 11 hey laptop display scale 200", "action": "set_display_scale", "target": "set_display_scale value=200", "target_raw": "set_display_scale value=200", "device": "both", "risk": "safe", "group": "G8:dev:G5:new:set_display_scale:3"}
311
+ {"text": "kyboard us set kar do jldi mere windows 11 pe", "action": "set_keyboard_layout", "target": "set_keyboard_layout layout=\"us\"", "target_raw": "set_keyboard_layout layout=\"us\"", "device": "both", "risk": "caution", "group": "G8:dev:G7:para:g3:set_keyboard_layout:hi:1:0"}
312
+ {"text": "set the locale to hi_in.utf-8 fast", "action": "set_locale", "target": "set_locale locale=\"hi_in.utf-8\"", "target_raw": "set_locale locale=\"hi_in.utf-8\"", "device": "both", "risk": "caution", "group": "G3:set_locale:en:1"}
313
+ {"text": "guest aaye hain, cursor slow karo yaar", "action": "set_mouse_speed", "target": "set_mouse_speed value=\"slow\"", "target_raw": "set_mouse_speed value=\"slow\"", "device": "both", "risk": "safe", "group": "G5:new:set_mouse_speed:4"}
314
+ {"text": "i want to change owner of /opt/app to rahul now", "action": "set_owner", "target": "set_owner path=\"/opt/app\" user=\"rahul\"", "target_raw": "set_owner path=\"/opt/app\" user=\"rahul\"", "device": "both", "risk": "critical", "group": "G7:para:g3:set_owner:en:0:0"}
315
+ {"text": "~/venv ki permission theek karo", "action": "set_permissions", "target": "set_permissions path=\"~/venv\"", "target_raw": "set_permissions path=\"~/venv\"", "device": "both", "risk": "critical", "group": "G3:set_permissions:hi:100"}
316
+ {"text": "set the piority of pid 9012 to 5 on the rpi 5", "action": "set_process_priority", "target": "set_process_priority pid=9012 priority=\"5\"", "target_raw": "set_process_priority pid=9012 priority=\"5\"", "device": "both", "risk": "caution", "group": "G8:dev:G3:set_process_priority:en:36"}
317
+ {"text": "refresh rate 144 hz karo for me", "action": "set_refresh_rate", "target": "set_refresh_rate value=144", "target_raw": "set_refresh_rate value=144", "device": "both", "risk": "caution", "group": "G5:new:set_refresh_rate:3"}
318
+ {"text": "configure a reminder in 10 minat to call mom", "action": "set_reminder", "target": "set_reminder amount=10 text=\"call mom\" unit=min", "target_raw": "set_reminder amount=10 text=\"call mom\" unit=min", "device": "both", "risk": "safe", "group": "G5:para:g:set_reminder:en:1:1"}
319
+ {"text": "ji 2560x1440 resolution laga do", "action": "set_resolution", "target": "set_resolution resolution=\"2560x1440\"", "target_raw": "set_resolution resolution=\"2560x1440\"", "device": "both", "risk": "caution", "group": "G5:new:set_resolution:6"}
320
+ {"text": "could you can you resize swap to 2048", "action": "set_swap_size", "target": "set_swap_size size=2048", "target_raw": "set_swap_size size=2048", "device": "both", "risk": "critical", "group": "G7:para:g3:set_swap_size:en:1:1"}
321
+ {"text": "hey pi vm swappiness 100 set karna hai", "action": "set_swappiness", "target": "set_swappiness value=100", "target_raw": "set_swappiness value=100", "device": "both", "risk": "caution", "group": "G7:para:g3:set_swappiness:hi:1:1"}
322
+ {"text": "on win 11 timer for dhai ghante", "action": "set_timer", "target": "set_timer amount=150 unit=min", "target_raw": "set_timer amount=150 unit=min", "device": "both", "risk": "safe", "group": "G8:dev:B:set_timer:en:3"}
323
+ {"text": "hey pi time zone utc karo bhai on my raspberry pi 5", "action": "set_timezone", "target": "set_timezone tz=\"utc\"", "target_raw": "set_timezone tz=\"utc\"", "device": "both", "risk": "caution", "group": "G8:dev:G7:para:g2:set_timezone:hi:1:1"}
324
+ {"text": "can you set the awaz to sixty-five", "action": "set_volume", "target": "set_volume value=65", "target_raw": "set_volume value=65", "device": "both", "risk": "safe", "group": "B:set_volume:en:13"}
325
+ {"text": "please backgrround mountain.jpg kar do, battery bachani hai", "action": "set_wallpaper", "target": "set_wallpaper path=\"mountain.jpg\"", "target_raw": "set_wallpaper path=\"mountain.jpg\"", "device": "both", "risk": "safe", "group": "G5:new:set_wallpaper:6"}
326
+ {"text": "kindly recent commands", "action": "show_command_history", "target": "show_command_history", "target_raw": "show_command_history", "device": "both", "risk": "safe", "group": "G2:show_command_history:en:59"}
327
+ {"text": "don't inc bas sab hatao desktop dikhao mere windows 11 pe", "action": "show_desktop", "target": "show_desktop", "target_raw": "show_desktop", "device": "both", "risk": "safe", "group": "G8:dev:B:contrast:show_desktop"}
328
+ {"text": "fetch pinout", "action": "show_pinout", "target": "show_pinout", "target_raw": "show_pinout", "device": "pi", "risk": "safe", "group": "G7:para:g:show_pinout:en:0:0"}
329
+ {"text": "pi Lalit_Home ka wifi password batao", "action": "show_wifi_password", "target": "show_wifi_password ssid=\"lalit_home\"", "target_raw": "show_wifi_password ssid=\"Lalit_Home\"", "device": "both", "risk": "caution", "group": "G4:show_wifi_password:6"}
330
+ {"text": "on my raspberry pi 5 schedule shutdown in 299 second!", "action": "shutdown", "target": "shutdown amount=299 unit=sec", "target_raw": "shutdown amount=299 unit=sec", "device": "both", "risk": "critical", "group": "G8:dev:B:shutdown:en:15"}
331
+ {"text": "sign out kr do fast", "action": "sign_out", "target": "sign_out", "target_raw": "sign_out", "device": "both", "risk": "critical", "group": "B:sign_out:hi:7"}
332
+ {"text": "kindly please suspend my laptop now", "action": "sleep", "target": "sleep", "target_raw": "sleep", "device": "both", "risk": "critical", "group": "A:sleep/test/0"}
333
+ {"text": "window ko left side kar do jaldi on windows 11", "action": "snap_left", "target": "snap_left", "target_raw": "snap_left", "device": "both", "risk": "safe", "group": "G8:dev:B:snap_left:hi:1"}
334
+ {"text": "on win 11 boss snap window to the right jaldi se", "action": "snap_right", "target": "snap_right", "target_raw": "snap_right", "device": "both", "risk": "safe", "group": "G8:dev:B:snap_right:en:0"}
335
+ {"text": "run a speed test jaldi se", "action": "speed_test", "target": "speed_test", "target_raw": "speed_test", "device": "both", "risk": "safe", "group": "G5:syn:speed_test:0"}
336
+ {"text": "suno can you create a new tmux session train", "action": "start_session", "target": "start_session name=\"train\"", "target_raw": "start_session name=\"train\"", "device": "both", "risk": "safe", "group": "G7:para:g3:start_session:en:1:0"}
337
+ {"text": "windows 11 ki i'm going out toh ollama band karo, meeting hai", "action": "stop_llm", "target": "stop_llm", "target_raw": "stop_llm", "device": "both", "risk": "caution", "group": "G8:dev:G3:stop_llm:hi:44"}
338
+ {"text": "zara could you start the stopwatch", "action": "stopwatch_start", "target": "stopwatch_start", "target_raw": "stopwatch_start", "device": "both", "risk": "safe", "group": "G7:para:g:stopwatch_start:en:0:2"}
339
+ {"text": "stopwatch band kar dijiyega", "action": "stopwatch_stop", "target": "stopwatch_stop", "target_raw": "stopwatch_stop", "device": "both", "risk": "safe", "group": "G7:para:g:stopwatch_stop:hi:0:1"}
340
+ {"text": "hindi keyboard lagao.", "action": "switch_input_language", "target": "switch_input_language", "target_raw": "switch_input_language", "device": "both", "risk": "safe", "group": "G:switch_input_language:hi:1"}
341
+ {"text": "raspberry pi 5 pe ek kaam karo account switch krdo kyunki kaam ho gaya", "action": "switch_user", "target": "switch_user", "target_raw": "switch_user", "device": "both", "risk": "caution", "group": "G8:dev:B:switch_user:hi:5"}
342
+ {"text": "next window fast", "action": "switch_window", "target": "switch_window", "target_raw": "switch_window", "device": "both", "risk": "safe", "group": "B:switch_window:en:3"}
343
+ {"text": "on win 11 hey pi time sync kar", "action": "sync_time", "target": "sync_time", "target_raw": "sync_time", "device": "both", "risk": "safe", "group": "G8:dev:G5:para:g2:sync_time:hi:0:0"}
344
+ {"text": "kaun kaun se app khule hain diikhao on the rpi 5", "action": "task_view", "target": "task_view", "target_raw": "task_view", "device": "both", "risk": "safe", "group": "G8:dev:B:task_view:hi:4"}
345
+ {"text": "bhaiya turn off touchpad jaldi se", "action": "touchpad_off", "target": "touchpad_off", "target_raw": "touchpad_off", "device": "both", "risk": "caution", "group": "G5:new:touchpad_off:0"}
346
+ {"text": "touchpaad enable kardo for me", "action": "touchpad_on", "target": "touchpad_on", "target_raw": "touchpad_on", "device": "both", "risk": "safe", "group": "G5:new:touchpad_on:5"}
347
+ {"text": "on windows 11, github.com tak packetx ka raasta dikhao", "action": "traceroute", "target": "traceroute host=\"github.com\"", "target_raw": "traceroute host=\"github.com\"", "device": "both", "risk": "safe", "group": "G8:dev:G2:traceroute:hi:61"}
348
+ {"text": "i need to convert test.wav to text", "action": "transcribe_audio", "target": "transcribe_audio file=\"test.wav\"", "target_raw": "transcribe_audio file=\"test.wav\"", "device": "both", "risk": "safe", "group": "G7:para:g3:transcribe_audio:en:2:1"}
349
+ {"text": "please copy backup.tar.gz to pi5.local abhi ke abhi", "action": "transfer_files", "target": "transfer_files file=\"backup.tar.gz\" host=\"pi5.local\"", "target_raw": "transfer_files file=\"backup.tar.gz\" host=\"pi5.local\"", "device": "both", "risk": "caution", "group": "G7:para:g3:transfer_files:en:0:0"}
350
+ {"text": "on my raspberry pi 5 type the text lecture tax crypto film", "action": "type_text", "target": "type_text text=\"lecture tax crypto film\"", "target_raw": "type_text text=\"lecture tax crypto film\"", "device": "both", "risk": "safe", "group": "G8:dev:B:type_text:en:3"}
351
+ {"text": "172.16.0.9 ko unban kar dijiyega please abhi", "action": "unban_ip", "target": "unban_ip ip=\"172.16.0.9\"", "target_raw": "unban_ip ip=\"172.16.0.9\"", "device": "both", "risk": "caution", "group": "G7:para:g3:unban_ip:hi:0:2"}
352
+ {"text": "i have a meeting toh undo for me", "action": "undo", "target": "undo", "target_raw": "undo", "device": "both", "risk": "safe", "group": "B:undo:en:0"}
353
+ {"text": "on win 11 ek kaam karo word ko hata do pease", "action": "uninstall_app", "target": "uninstall_app app=word", "target_raw": "uninstall_app app=word", "device": "both", "risk": "critical", "group": "G8:dev:G7:para:g:uninstall_app:hi:1:0"}
354
+ {"text": "zara uninstall redis", "action": "uninstall_package", "target": "uninstall_package name=\"redis\"", "target_raw": "uninstall_package name=\"redis\"", "device": "both", "risk": "critical", "group": "G3:uninstall_package:en:63"}
355
+ {"text": "hey computer tell me something funny kar sakte ho", "action": "unknown", "target": "unknown", "target_raw": "unknown", "device": "both", "risk": "safe", "group": "A:unknown/test/5"}
356
+ {"text": "ssd nikalo right now", "action": "unmount_drive", "target": "unmount_drive device=\"ssd\"", "target_raw": "unmount_drive device=\"ssd\"", "device": "both", "risk": "caution", "group": "G5:para:g2:unmount_drive:hi:1:0"}
357
+ {"text": "can you meri awaaz unmute kar dena thanks", "action": "unmute", "target": "unmute", "target_raw": "unmute", "device": "both", "risk": "safe", "group": "A:unmute/test/1"}
358
+ {"text": "repository list refresy kro", "action": "update_packages", "target": "update_packages", "target_raw": "update_packages", "device": "both", "risk": "safe", "group": "G5:syn:update_packages:3"}
359
+ {"text": "raspberry pi 5 pe mere computer pe speaker ka level neeche karo abhi", "action": "volume_down", "target": "volume_down", "target_raw": "volume_down", "device": "both", "risk": "safe", "group": "G8:dev:A:volume_down/practical/3"}
360
+ {"text": "increase the speaker volume by 35 right now", "action": "volume_up", "target": "volume_up step=35", "target_raw": "volume_up step=35", "device": "both", "risk": "safe", "group": "B:volume_up:en:14"}
361
+ {"text": "bhai vpn chalu karo", "action": "vpn_connect", "target": "vpn_connect", "target_raw": "vpn_connect", "device": "both", "risk": "safe", "group": "G5:pol:vpn_connect:0:4"}
362
+ {"text": "stop vpn connction thanks", "action": "vpn_disconnect", "target": "vpn_disconnect", "target_raw": "vpn_disconnect", "device": "both", "risk": "caution", "group": "G5:pol:vpn_disconnect:2:3"}
363
+ {"text": "ek kaam karo python3 main.py ko har 2 second chalao jaldi", "action": "watch_command", "target": "watch_command command=\"python3 main.py\" interval=2", "target_raw": "watch_command command=\"python3 main.py\" interval=2", "device": "both", "risk": "caution", "group": "G7:para:g3:watch_command:hi:0:0"}
364
+ {"text": "localhost:9000 kholo cred hungry_raj/Gpt#123 se login kar de", "action": "web_login", "target": "web_login site=\"localhost:9000\" username=\"hungry_raj\" password=\"gpt#123\"", "target_raw": "web_login site=\"localhost:9000\" username=\"hungry_raj\" password=\"Gpt#123\"", "device": "both", "risk": "caution", "group": "G2:web_login:local:1"}
365
+ {"text": "google karo raasta brairxaur", "action": "web_search", "target": "web_search query=\"raasta brairxaur\"", "target_raw": "web_search query=\"raasta brairxaur\"", "device": "both", "risk": "safe", "group": "B:web_search:hi:7"}
366
+ {"text": "turn off the wireless", "action": "wifi_off", "target": "wifi_off", "target_raw": "wifi_off", "device": "both", "risk": "critical", "group": "B:wifi_off:en:0"}
367
+ {"text": "hey computer ab wireless ko chalu kar dena na", "action": "wifi_on", "target": "wifi_on", "target_raw": "wifi_on", "device": "both", "risk": "caution", "group": "A:wifi_on/test/1"}
368
+ {"text": "not instagram website le aao, youtube me how to agla gaana dhundo", "action": "youtube_search", "target": "youtube_search query=\"how to agla gaana\"", "target_raw": "youtube_search query=\"how to agla gaana\"", "device": "both", "risk": "safe", "group": "B:contrast:youtube_search"}
369
+ {"text": "guest aaye hain, the paeg bada karo", "action": "zoom_in", "target": "zoom_in", "target_raw": "zoom_in", "device": "both", "risk": "safe", "group": "G5:pol:zoom_in:1:1"}
370
+ {"text": "kindly zoom out more", "action": "zoom_out", "target": "zoom_out", "target_raw": "zoom_out", "device": "both", "risk": "safe", "group": "B:zoom_out:en:5"}
371
+ {"text": "actual size, call pe hoon", "action": "zoom_reset", "target": "zoom_reset", "target_raw": "zoom_reset", "device": "both", "risk": "safe", "group": "B:zoom_reset:en:3"}
eval/make_report.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Generate testresult.html: every unique activity prompt -> expected intent, model output, executor command (Windows + Pi),
2
+ device, model status, executor status (real execution for safe read-only actions on this machine, dry-run otherwise).
3
+ python eval/make_report.py <run_dir_with_eval/> (uses model/ numpy runtime for the curated rows)"""
4
+ import json, os, sys, html, time, collections, platform as _pf
5
+ HERE = os.path.dirname(os.path.abspath(__file__)); ROOT = os.path.dirname(HERE)
6
+ sys.path.insert(0, os.path.join(ROOT, "model")); sys.path.insert(0, os.path.join(ROOT, "executor"))
7
+ from runtime import CommandModel # noqa
8
+ from catalog import ACTIONS # noqa
9
+ import executor as EX # noqa
10
+ run_dir = sys.argv[1] if len(sys.argv) > 1 else None
11
+ _sp = os.path.join(run_dir, "eval", "summary.json") if run_dir else os.path.join(HERE, "model_eval_summary.json")
12
+ summary = json.load(open(_sp)) if os.path.exists(_sp) else {}
13
+ curated = [json.loads(l) for l in open(os.path.join(HERE, "curated_prompts.jsonl"), encoding="utf-8")]
14
+ model = CommandModel(os.path.join(ROOT, "model"))
15
+ esc = lambda s: html.escape(str(s if s is not None else ""))
16
+ EXEC_HERE = {"sh", "py"} # kinds that can really run on this Linux box
17
+ rows = []; t_all = time.time(); exec_counts = collections.Counter(); model_ok = 0
18
+ for r in curated:
19
+ out = model.predict(r["text"]); cmd = {k: v for k, v in out.items() if k != "_meta"}; canon = out["_meta"]["canonical"]
20
+ ok = canon == r["target"]; model_ok += ok
21
+ plans = {pl: EX.plan(cmd, pl, r["text"]) for pl in ("pi", "win")}
22
+ ppi = plans["pi"]; st, outp = "", ""
23
+ if not ppi.supported: st, outp = "n/a on Pi/Linux", ppi.note
24
+ elif ppi.kind not in EXEC_HERE: st, outp = "dry-run", f"{ppi.kind} step (needs desktop/keyboard); command rendered only"
25
+ elif ppi.risk != "safe": st, outp = f"dry-run ({ppi.risk}, gated)", "rendered only; UI asks for confirmation before running"
26
+ elif not ok: st, outp = "skipped (model mismatch)", "not executed because the parse differed from the expected intent"
27
+ else:
28
+ res = EX.run(ppi, cmd, dry_run=False); outp = res["output"][:300]
29
+ st = "executed: tool not on this machine" if ("command not found" in outp or ("No such file" in outp and "/sys/" in outp)) else f"executed: {res['status']}"
30
+ exec_counts[st.split(":")[0].split(" (")[0]] += 1
31
+ rows.append({"text": r["text"], "action": r["action"], "device": r["device"], "risk": r["risk"], "expected": r["target"], "pred": canon, "json": cmd, "ok": ok, "conf": out["_meta"]["confidence"],
32
+ "cmd_win": plans["win"].command if plans["win"].supported else "— " + plans["win"].note, "cmd_pi": ppi.command if ppi.supported else "— " + ppi.note, "kind_pi": ppi.kind, "exec_status": st, "exec_out": outp})
33
+ acc = model_ok / len(rows)
34
+ def cell_json(j): return "<br>".join(f"<span class=k>{esc(k)}</span>={esc('••••' if k == 'password' else v)}" for k, v in j.items() if k != "action")
35
+ summ_rows = "".join(f"<tr><td>{esc(n)}</td><td>{s['n']}</td><td class='{ 'g' if s['exact']>=0.99 else 'y' if s['exact']>=0.95 else 'r'}'><b>{s['exact']*100:.2f}%</b></td><td>{s['action']*100:.2f}%</td><td class=small>{esc(', '.join(f'{a}→{b} ({n})' for (a,b),n in s['top_confusions'][:5]))}</td></tr>" for n, s in summary.items())
36
+ by_risk = collections.Counter(r["risk"] for r in rows); by_dev = collections.Counter(r["device"] for r in rows)
37
+ table = "".join(f"""<tr class="{'ok' if r['ok'] else 'fail'}"><td>{i+1}</td><td>{esc(r['text'])}</td><td><b>{esc(r['action'])}</b><div class=small>{esc(ACTIONS[r['action']]['desc'])}</div></td>
38
+ <td><code>{esc(r['pred'])}</code><div class=small>{cell_json(r['json'])}</div><div class=small>conf {r['conf']*100:.1f}%</div></td>
39
+ <td class="{'g' if r['ok'] else 'r'}"><b>{'PASS' if r['ok'] else 'FAIL'}</b>{'' if r['ok'] else '<div class=small>expected: <code>'+esc(r['expected'])+'</code></div>'}</td>
40
+ <td><span class="pill {esc(r['risk'])}">{esc(r['risk'])}</span><div class=small>{esc(r['device'])}</div></td>
41
+ <td><div class=small><b>Windows</b></div><pre>{esc(r['cmd_win'][:400])}</pre><div class=small><b>Raspberry Pi</b> [{esc(r['kind_pi'])}]</div><pre>{esc(r['cmd_pi'][:400])}</pre></td>
42
+ <td><b>{esc(r['exec_status'])}</b><pre>{esc(r['exec_out'][:300])}</pre></td></tr>""" for i, r in enumerate(rows))
43
+ doc = f"""<!doctype html><html lang=en><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Union Command Agent — test results</title>
44
+ <style>:root{{--bg:#0f1115;--panel:#171a21;--panel2:#1e222b;--border:#2a2f3a;--text:#e6e8ee;--muted:#9aa3b2;--acc:#c51a4a;--ok:#6cc04a;--warn:#f2c94c;--bad:#ff6b6b}}
45
+ body{{margin:0;background:var(--bg);color:var(--text);font:13.5px/1.45 system-ui,Segoe UI,Roboto,sans-serif}}header{{background:var(--panel);border-bottom:1px solid var(--border);padding:14px 20px}}h1{{margin:0 0 4px;font-size:18px}}main{{padding:16px 20px 60px;max-width:1700px;margin:0 auto}}
46
+ .grid{{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin:12px 0}}.stat{{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:10px 12px}}.stat b{{font-size:22px;display:block}}.stat span{{color:var(--muted);font-size:12px}}
47
+ table{{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden;margin:10px 0 22px}}th{{text-align:left;padding:8px 10px;font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);background:var(--panel2);border-bottom:1px solid var(--border)}}
48
+ td{{padding:8px 10px;border-bottom:1px solid var(--border);vertical-align:top}}tr.fail td{{background:#1f1517}}pre{{margin:2px 0;white-space:pre-wrap;word-break:break-all;background:#0b0d12;padding:5px 7px;border-radius:5px;font-size:11.5px;max-height:120px;overflow:auto}}code{{font-family:ui-monospace,Consolas,monospace;font-size:12px}}
49
+ .small{{color:var(--muted);font-size:11.5px}}.k{{color:var(--muted)}}.g{{color:var(--ok)}}.y{{color:var(--warn)}}.r{{color:var(--bad)}}.pill{{display:inline-block;font-size:11px;padding:1px 7px;border-radius:10px;border:1px solid var(--border)}}.safe{{color:var(--ok)}}.caution{{color:var(--warn)}}.critical{{color:var(--bad)}}
50
+ h2{{font-size:15px;margin:22px 0 6px}}p.note{{color:var(--muted);max-width:1100px}}input{{width:100%;padding:8px 10px;background:#0b0d12;color:var(--text);border:1px solid var(--border);border-radius:6px;font:inherit;margin:6px 0}}</style></head><body>
51
+ <header><h1>Union Command Agent — test results</h1><div class=small>generated {time.strftime('%Y-%m-%d %H:%M')} on {esc(_pf.node())} ({esc(_pf.system())}) · model: char-level transformer seq2seq, {sum(v.size for v in model.W.values())/1e6:.2f}M params, grammar-constrained decoding · {len(ACTIONS)} actions</div></header><main>
52
+ <div class=grid><div class=stat><b class="{'g' if acc>=0.99 else 'y'}">{acc*100:.2f}%</b><span>unique-activity prompts exact match ({model_ok}/{len(rows)}) — one held-out-template prompt per action</span></div>
53
+ {''.join(f"<div class=stat><b class='{'g' if s['exact']>=0.99 else 'y' if s['exact']>=0.95 else 'r'}'>{s['exact']*100:.2f}%</b><span>{esc(n)} exact (n={s['n']})</span></div>" for n, s in summary.items() if n in ('val','test_strict','curated_strict','B_golden_final'))}
54
+ <div class=stat><b>{len(rows)}</b><span>activities: safe {by_risk['safe']} · caution {by_risk['caution']} · critical {by_risk['critical']}</span></div><div class=stat><b>{by_dev['both']}/{by_dev['pi']}/{by_dev['windows']}</b><span>both / Pi-only / Windows-only</span></div></div>
55
+ <h2>Model accuracy per set</h2><p class=note><b>exact</b> = full canonical target (action + every slot value) matches. <b>action</b> = action label only. <i>val</i> shares templates with training. <i>test</i> / <i>curated</i> are held-out <b>templates</b>; since v6 the dataset also contains machine paraphrases of templates, so a held-out paraphrase can have a sibling paraphrase in train — <i>test_strict</i> / <i>curated_strict</i> keep only base-template rows (no sibling anywhere in train) and are the honest generalisation numbers. A_* / B_* are the two source projects' own evaluation sets relabelled to the union schema (their label conventions differ from the union in places, so they under-count).</p>
56
+ <table><thead><tr><th>set</th><th>n</th><th>exact</th><th>action</th><th>top confusions</th></tr></thead><tbody>{summ_rows}</tbody></table>
57
+ <h2>Executor status on this machine</h2><p class=note>Safe, read-only actions whose Pi/Linux command is runnable here were <b>actually executed</b> and their output captured. Caution/critical actions are rendered but gated (the UI asks for confirmation; critical ones require typing the action name). Key/desktop steps need a display. {esc(', '.join(f'{k}: {v}' for k, v in exec_counts.most_common()))}.</p>
58
+ <h2>Every unique activity ({len(rows)})</h2><input id=q placeholder="filter… (e.g. gpio, wifi, FAIL, critical)" oninput="f()">
59
+ <table id=t><thead><tr><th>#</th><th style="width:15%">prompt</th><th style="width:11%">intent (expected)</th><th style="width:15%">model output</th><th>model</th><th>risk / device</th><th style="width:30%">executor command</th><th style="width:14%">executor status</th></tr></thead><tbody>{table}</tbody></table>
60
+ <script>function f(){{const q=document.getElementById('q').value.toLowerCase();document.querySelectorAll('#t tbody tr').forEach(r=>r.style.display=r.textContent.toLowerCase().includes(q)?'':'none')}}</script></main></body></html>"""
61
+ open(os.path.join(HERE, "testresult.html"), "w", encoding="utf-8").write(doc)
62
+ print(f"curated exact {acc*100:.2f}% ({model_ok}/{len(rows)}); executor: {dict(exec_counts)}; report in {time.time()-t_all:.0f}s -> eval/testresult.html")
eval/model_eval_summary.json ADDED
@@ -0,0 +1,747 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "val": {
3
+ "n": 10413,
4
+ "exact": 0.991,
5
+ "action": 0.9929,
6
+ "top_confusions": [
7
+ [
8
+ [
9
+ "get_hostname",
10
+ "unknown"
11
+ ],
12
+ 9
13
+ ],
14
+ [
15
+ [
16
+ "rename_file",
17
+ "hash_file"
18
+ ],
19
+ 6
20
+ ],
21
+ [
22
+ [
23
+ "unknown",
24
+ "help"
25
+ ],
26
+ 5
27
+ ],
28
+ [
29
+ [
30
+ "unknown",
31
+ "type_text"
32
+ ],
33
+ 4
34
+ ],
35
+ [
36
+ [
37
+ "unknown",
38
+ "connect_wifi"
39
+ ],
40
+ 3
41
+ ],
42
+ [
43
+ [
44
+ "unknown",
45
+ "hibernate"
46
+ ],
47
+ 2
48
+ ],
49
+ [
50
+ [
51
+ "set_alarm",
52
+ "set_alarm"
53
+ ],
54
+ 2
55
+ ],
56
+ [
57
+ [
58
+ "get_cpu_clock",
59
+ "get_time"
60
+ ],
61
+ 2
62
+ ],
63
+ [
64
+ [
65
+ "shutdown",
66
+ "shutdown"
67
+ ],
68
+ 2
69
+ ],
70
+ [
71
+ [
72
+ "youtube_search",
73
+ "youtube_search"
74
+ ],
75
+ 2
76
+ ],
77
+ [
78
+ [
79
+ "search_files",
80
+ "search_files"
81
+ ],
82
+ 2
83
+ ],
84
+ [
85
+ [
86
+ "type_text",
87
+ "type_text"
88
+ ],
89
+ 2
90
+ ]
91
+ ],
92
+ "secs": 21
93
+ },
94
+ "test": {
95
+ "n": 10618,
96
+ "exact": 0.9837,
97
+ "action": 0.9852,
98
+ "top_confusions": [
99
+ [
100
+ [
101
+ "unknown",
102
+ "clarify"
103
+ ],
104
+ 19
105
+ ],
106
+ [
107
+ [
108
+ "unknown",
109
+ "get_reboot_history"
110
+ ],
111
+ 18
112
+ ],
113
+ [
114
+ [
115
+ "format_drive",
116
+ "get_sdcard_info"
117
+ ],
118
+ 15
119
+ ],
120
+ [
121
+ [
122
+ "unknown",
123
+ "web_search"
124
+ ],
125
+ 10
126
+ ],
127
+ [
128
+ [
129
+ "unknown",
130
+ "cancel_shutdown"
131
+ ],
132
+ 10
133
+ ],
134
+ [
135
+ [
136
+ "discover_devices",
137
+ "scan_lan"
138
+ ],
139
+ 9
140
+ ],
141
+ [
142
+ [
143
+ "board_to_bcm",
144
+ "bcm_to_board"
145
+ ],
146
+ 8
147
+ ],
148
+ [
149
+ [
150
+ "unknown",
151
+ "shutdown"
152
+ ],
153
+ 7
154
+ ],
155
+ [
156
+ [
157
+ "search_in_files",
158
+ "search_files"
159
+ ],
160
+ 7
161
+ ],
162
+ [
163
+ [
164
+ "close_app",
165
+ "uninstall_app"
166
+ ],
167
+ 6
168
+ ],
169
+ [
170
+ [
171
+ "service_start",
172
+ "service_enable"
173
+ ],
174
+ 5
175
+ ],
176
+ [
177
+ [
178
+ "unknown",
179
+ "undo"
180
+ ],
181
+ 4
182
+ ]
183
+ ],
184
+ "secs": 19
185
+ },
186
+ "test_strict": {
187
+ "n": 6611,
188
+ "exact": 0.9753,
189
+ "action": 0.977,
190
+ "top_confusions": [],
191
+ "secs": 0
192
+ },
193
+ "curated": {
194
+ "n": 371,
195
+ "exact": 0.9946,
196
+ "action": 0.9973,
197
+ "top_confusions": [
198
+ [
199
+ [
200
+ "gpio_on",
201
+ "gpio_on"
202
+ ],
203
+ 1
204
+ ],
205
+ [
206
+ [
207
+ "discover_devices",
208
+ "scan_lan"
209
+ ],
210
+ 1
211
+ ]
212
+ ],
213
+ "secs": 1
214
+ },
215
+ "curated_strict": {
216
+ "n": 253,
217
+ "exact": 0.9921,
218
+ "action": 0.996,
219
+ "top_confusions": [],
220
+ "secs": 0
221
+ },
222
+ "A_challenge": {
223
+ "n": 1152,
224
+ "exact": 0.974,
225
+ "action": 0.9844,
226
+ "top_confusions": [
227
+ [
228
+ [
229
+ "open_app",
230
+ "open_app"
231
+ ],
232
+ 6
233
+ ],
234
+ [
235
+ [
236
+ "read_file",
237
+ "read_file"
238
+ ],
239
+ 6
240
+ ],
241
+ [
242
+ [
243
+ "unknown",
244
+ "set_volume"
245
+ ],
246
+ 6
247
+ ],
248
+ [
249
+ [
250
+ "unknown",
251
+ "format_drive"
252
+ ],
253
+ 6
254
+ ],
255
+ [
256
+ [
257
+ "unknown",
258
+ "cancel_shutdown"
259
+ ],
260
+ 4
261
+ ],
262
+ [
263
+ [
264
+ "media_play",
265
+ "media_play_pause"
266
+ ],
267
+ 1
268
+ ],
269
+ [
270
+ [
271
+ "unknown",
272
+ "bookmark_page"
273
+ ],
274
+ 1
275
+ ]
276
+ ],
277
+ "secs": 1
278
+ },
279
+ "A_practical-dev": {
280
+ "n": 1321,
281
+ "exact": 0.9531,
282
+ "action": 0.9644,
283
+ "top_confusions": [
284
+ [
285
+ [
286
+ "read_file",
287
+ "read_file"
288
+ ],
289
+ 8
290
+ ],
291
+ [
292
+ [
293
+ "unknown",
294
+ "format_drive"
295
+ ],
296
+ 8
297
+ ],
298
+ [
299
+ [
300
+ "open_app",
301
+ "open_app"
302
+ ],
303
+ 6
304
+ ],
305
+ [
306
+ [
307
+ "unknown",
308
+ "set_volume"
309
+ ],
310
+ 6
311
+ ],
312
+ [
313
+ [
314
+ "set_brightness",
315
+ "clarify"
316
+ ],
317
+ 5
318
+ ],
319
+ [
320
+ [
321
+ "unknown",
322
+ "cancel_shutdown"
323
+ ],
324
+ 4
325
+ ],
326
+ [
327
+ [
328
+ "set_volume",
329
+ "clarify"
330
+ ],
331
+ 4
332
+ ],
333
+ [
334
+ [
335
+ "unknown",
336
+ "factory_reset"
337
+ ],
338
+ 3
339
+ ],
340
+ [
341
+ [
342
+ "clarify",
343
+ "set_brightness"
344
+ ],
345
+ 3
346
+ ],
347
+ [
348
+ [
349
+ "clarify",
350
+ "set_volume"
351
+ ],
352
+ 2
353
+ ],
354
+ [
355
+ [
356
+ "media_play",
357
+ "media_play_pause"
358
+ ],
359
+ 1
360
+ ],
361
+ [
362
+ [
363
+ "unknown",
364
+ "bookmark_page"
365
+ ],
366
+ 1
367
+ ]
368
+ ],
369
+ "secs": 1
370
+ },
371
+ "A_practical-holdout": {
372
+ "n": 428,
373
+ "exact": 0.9206,
374
+ "action": 0.9416,
375
+ "top_confusions": [
376
+ [
377
+ [
378
+ "clarify",
379
+ "set_volume"
380
+ ],
381
+ 4
382
+ ],
383
+ [
384
+ [
385
+ "ping",
386
+ "ping"
387
+ ],
388
+ 3
389
+ ],
390
+ [
391
+ [
392
+ "open_app",
393
+ "open_app"
394
+ ],
395
+ 2
396
+ ],
397
+ [
398
+ [
399
+ "list_files",
400
+ "search_in_files"
401
+ ],
402
+ 2
403
+ ],
404
+ [
405
+ [
406
+ "list_partitions",
407
+ "unknown"
408
+ ],
409
+ 2
410
+ ],
411
+ [
412
+ [
413
+ "read_file",
414
+ "read_file"
415
+ ],
416
+ 2
417
+ ],
418
+ [
419
+ [
420
+ "open_app",
421
+ "open_file"
422
+ ],
423
+ 1
424
+ ],
425
+ [
426
+ [
427
+ "get_system_info",
428
+ "list_services"
429
+ ],
430
+ 1
431
+ ],
432
+ [
433
+ [
434
+ "service_stop",
435
+ "service_start"
436
+ ],
437
+ 1
438
+ ],
439
+ [
440
+ [
441
+ "run_script",
442
+ "format_drive"
443
+ ],
444
+ 1
445
+ ],
446
+ [
447
+ [
448
+ "run_script",
449
+ "factory_reset"
450
+ ],
451
+ 1
452
+ ],
453
+ [
454
+ [
455
+ "set_volume",
456
+ "set_volume"
457
+ ],
458
+ 1
459
+ ]
460
+ ],
461
+ "secs": 1
462
+ },
463
+ "B_golden_dev": {
464
+ "n": 383,
465
+ "exact": 0.9504,
466
+ "action": 0.9582,
467
+ "top_confusions": [
468
+ [
469
+ [
470
+ "youtube_search",
471
+ "youtube_search"
472
+ ],
473
+ 1
474
+ ],
475
+ [
476
+ [
477
+ "unknown",
478
+ "volume_up"
479
+ ],
480
+ 1
481
+ ],
482
+ [
483
+ [
484
+ "open_site",
485
+ "web_search"
486
+ ],
487
+ 1
488
+ ],
489
+ [
490
+ [
491
+ "restart",
492
+ "cancel_shutdown"
493
+ ],
494
+ 1
495
+ ],
496
+ [
497
+ [
498
+ "unknown",
499
+ "get_temperature"
500
+ ],
501
+ 1
502
+ ],
503
+ [
504
+ [
505
+ "unknown",
506
+ "get_kernel_log"
507
+ ],
508
+ 1
509
+ ],
510
+ [
511
+ [
512
+ "open_app",
513
+ "open_site"
514
+ ],
515
+ 1
516
+ ],
517
+ [
518
+ [
519
+ "unknown",
520
+ "open_file"
521
+ ],
522
+ 1
523
+ ],
524
+ [
525
+ [
526
+ "open_app",
527
+ "open_app"
528
+ ],
529
+ 1
530
+ ],
531
+ [
532
+ [
533
+ "unknown",
534
+ "set_display_scale"
535
+ ],
536
+ 1
537
+ ],
538
+ [
539
+ [
540
+ "unknown",
541
+ "recent_files"
542
+ ],
543
+ 1
544
+ ],
545
+ [
546
+ [
547
+ "unknown",
548
+ "lock_screen"
549
+ ],
550
+ 1
551
+ ]
552
+ ],
553
+ "secs": 0
554
+ },
555
+ "B_golden_final": {
556
+ "n": 384,
557
+ "exact": 0.974,
558
+ "action": 0.974,
559
+ "top_confusions": [
560
+ [
561
+ [
562
+ "unknown",
563
+ "get_date"
564
+ ],
565
+ 2
566
+ ],
567
+ [
568
+ [
569
+ "ping",
570
+ "clarify"
571
+ ],
572
+ 1
573
+ ],
574
+ [
575
+ [
576
+ "unknown",
577
+ "network_status"
578
+ ],
579
+ 1
580
+ ],
581
+ [
582
+ [
583
+ "unknown",
584
+ "shutdown"
585
+ ],
586
+ 1
587
+ ],
588
+ [
589
+ [
590
+ "unknown",
591
+ "get_time"
592
+ ],
593
+ 1
594
+ ],
595
+ [
596
+ [
597
+ "unknown",
598
+ "clipboard_history"
599
+ ],
600
+ 1
601
+ ],
602
+ [
603
+ [
604
+ "bluetooth_on",
605
+ "bluetooth_connect"
606
+ ],
607
+ 1
608
+ ],
609
+ [
610
+ [
611
+ "set_brightness",
612
+ "brightness_up"
613
+ ],
614
+ 1
615
+ ],
616
+ [
617
+ [
618
+ "unknown",
619
+ "help"
620
+ ],
621
+ 1
622
+ ]
623
+ ],
624
+ "secs": 0
625
+ },
626
+ "B_typo": {
627
+ "n": 3000,
628
+ "exact": 0.9917,
629
+ "action": 0.995,
630
+ "top_confusions": [
631
+ [
632
+ [
633
+ "youtube_search",
634
+ "youtube_search"
635
+ ],
636
+ 3
637
+ ],
638
+ [
639
+ [
640
+ "close_app",
641
+ "close_app"
642
+ ],
643
+ 2
644
+ ],
645
+ [
646
+ [
647
+ "gpio_on",
648
+ "gpio_on"
649
+ ],
650
+ 2
651
+ ],
652
+ [
653
+ [
654
+ "battery_saver_off",
655
+ "battery_saver_on"
656
+ ],
657
+ 1
658
+ ],
659
+ [
660
+ [
661
+ "media_pause",
662
+ "paste"
663
+ ],
664
+ 1
665
+ ],
666
+ [
667
+ [
668
+ "service_start",
669
+ "service_enable"
670
+ ],
671
+ 1
672
+ ],
673
+ [
674
+ [
675
+ "open_site",
676
+ "unknown"
677
+ ],
678
+ 1
679
+ ],
680
+ [
681
+ [
682
+ "set_brightness",
683
+ "brightness_down"
684
+ ],
685
+ 1
686
+ ],
687
+ [
688
+ [
689
+ "open_app",
690
+ "unknown"
691
+ ],
692
+ 1
693
+ ],
694
+ [
695
+ [
696
+ "open_folder",
697
+ "open_file"
698
+ ],
699
+ 1
700
+ ],
701
+ [
702
+ [
703
+ "open_settings",
704
+ "open_settings"
705
+ ],
706
+ 1
707
+ ],
708
+ [
709
+ [
710
+ "wifi_off",
711
+ "cut"
712
+ ],
713
+ 1
714
+ ]
715
+ ],
716
+ "secs": 4
717
+ },
718
+ "wifi_holdout": {
719
+ "n": 461,
720
+ "exact": 1.0,
721
+ "action": 1.0,
722
+ "top_confusions": [],
723
+ "secs": 1
724
+ },
725
+ "gap10_holdout": {
726
+ "n": 1401,
727
+ "exact": 1.0,
728
+ "action": 1.0,
729
+ "top_confusions": [],
730
+ "secs": 2
731
+ },
732
+ "gap11_holdout": {
733
+ "n": 696,
734
+ "exact": 0.9928,
735
+ "action": 1.0,
736
+ "top_confusions": [
737
+ [
738
+ [
739
+ "connect_wifi",
740
+ "connect_wifi"
741
+ ],
742
+ 5
743
+ ]
744
+ ],
745
+ "secs": 1
746
+ }
747
+ }
eval/smoke_test.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Smoke test: model + executor, no UI, nothing is executed (plans only).
2
+ python eval/smoke_test.py # fixed checks (~5 s)
3
+ python eval/smoke_test.py --full # + all 371 curated activity prompts and the wifi held-out set (~1-2 min)
4
+ Exit code 0 = every MUST check passed. KNOWN checks are phrasings the CPU model (run5) gets wrong; they are
5
+ expected to pass after the Colab model is installed and are reported, not failed on.
6
+ """
7
+ import json, os, sys, time
8
+ HERE = os.path.dirname(os.path.abspath(__file__)); ROOT = os.path.dirname(HERE)
9
+ sys.path[:0] = [os.path.join(ROOT, "model"), os.path.join(ROOT, "executor")]
10
+ from runtime import CommandModel # noqa
11
+ import executor as EX # noqa
12
+
13
+ # (prompt, expected canonical target, level) level: MUST | KNOWN
14
+ MODEL_CASES = [
15
+ ("awaaz ko pachaas pe rakh do", 'set_volume value=50', "MUST"),
16
+ ("volume badhao", 'volume_up', "MUST"),
17
+ ("brightness 70 kar do", 'set_brightness value=70', "MUST"),
18
+ ("board pin 11 pe led jalao", 'gpio_on pin=11 numbering=board', "MUST"),
19
+ ("gpio 17 ko off karo", 'gpio_off pin=17', "MUST"),
20
+ ("wifi Airtel_5G se connect karo password Wifi@2024", 'connect_wifi ssid="airtel_5g" password="wifi@2024"', "MUST"),
21
+ ("connect to wifi JioFiber-Home with password jio#12345", 'connect_wifi ssid="jiofiber-home" password="jio#12345"', "MUST"),
22
+ ("connect wifi Guest_Network pwd guest@123", 'connect_wifi ssid="guest_network" password="guest@123"', "MUST"),
23
+ ("konse wifi networks available hai", 'list_wifi', "MUST"),
24
+ ("wifi band karo", 'wifi_off', "MUST"),
25
+ ("chrome kholo", 'open_app app=chrome', "MUST"),
26
+ # run5 gets these wrong (see HANDOVER.md); the executor guard turns most of them into a clarification instead of a bad command
27
+ ("mere ghar ka wifi TP-Link_A1B2 hai, password hai Pass@word99, connect kar do", 'connect_wifi ssid="tp-link_a1b2" password="pass@word99"', "KNOWN"),
28
+ ("ssid: Office WiFi 5G password: Off!ce2024 se jud jao", 'connect_wifi ssid="office wifi 5g" password="off!ce2024"', "KNOWN"),
29
+ ("wifi se connect karo naam MyNet pass abc12345", 'connect_wifi ssid="mynet" password="abc12345"', "KNOWN"),
30
+ ("wifi Airtel_5G bhool jao", 'forget_wifi ssid="airtel_5g"', "KNOWN"),
31
+ ]
32
+
33
+ # executor-only checks: (parsed command, platform, predicate on plan, description)
34
+ def _has(s): return lambda p: s in (p.command or "")
35
+ EXEC_CASES = [
36
+ ({"action": "set_volume", "value": 50}, "pi", lambda p: p.supported and p.risk == "safe" and "50%" in p.command, "volume -> wpctl 50%"),
37
+ ({"action": "gpio_on", "pin": 11, "numbering": "board"}, "pi", _has("pinctrl set 17 op dh"), "board 11 -> BCM 17"),
38
+ ({"action": "gpio_on", "pin": 2, "numbering": "board"}, "pi", lambda p: not p.supported, "board pin 2 (5V) refused"),
39
+ ({"action": "gpio_on", "pin": 40}, "pi", lambda p: not p.supported, "BCM 40 refused"),
40
+ ({"action": "connect_wifi", "ssid": "Office WiFi", "password": "a'b&c"}, "pi", _has("'Office WiFi' password 'a'\"'\"'b&c'"), "Pi: ssid/password shell-quoted"),
41
+ ({"action": "connect_wifi", "ssid": "Airtel_5G"}, "pi", lambda p: "password" not in p.command, "Pi: no empty 'password' arg"),
42
+ ({"action": "connect_wifi", "ssid": "Airtel_5G", "password": "Wifi@2024"}, "win", lambda p: "netsh wlan add profile" in p.command and "keyMaterial" in p.command, "Windows: profile with key, then connect"),
43
+ ({"action": "connect_wifi", "ssid": "TP-Link", "password": "hai"}, "pi", lambda p: p.action == "clarify", "filler password -> clarify"),
44
+ ({"action": "connect_wifi", "ssid": "Office WiFi", "password": "Office WiFi"}, "pi", lambda p: p.action == "clarify", "password == ssid -> clarify"),
45
+ ({"action": "connect_wifi", "ssid": "MyNet pass abc12345"}, "pi", lambda p: p.action == "clarify", "password inside ssid -> clarify"),
46
+ ({"action": "connect_wifi", "ssid": "baad mein", "password": "rudra@11"}, "pi", lambda p: p.action == "clarify", "'baad mein' copied as ssid -> clarify"),
47
+ ({"action": "connect_wifi", "ssid": "Redmi Note 13", "password": "pehle:"}, "pi", lambda p: p.action == "clarify", "'pehle:' copied as password -> clarify"),
48
+ ({"action": "shutdown"}, "pi", lambda p: p.risk == "critical" and not EX.gate(p)[0] and EX.gate(p, confirm_text="shutdown")[0], "critical needs typed confirmation"),
49
+ ({"action": "connect_wifi", "ssid": "a", "password": "bbbbbbbb"}, "pi", lambda p: not EX.gate(p)[0] and EX.gate(p, allow_caution=True)[0], "caution needs allow flag"),
50
+ ({"action": "run_command", "command": "ls -la"}, "pi", lambda p: p.risk == "critical", "run_command is critical"),
51
+ ({"action": "set_volume", "value": 40}, "win", lambda p: "= None;" not in p.command and "$None" not in p.command and "[Audio]::Volume=40/100" in p.command, "Windows audio helper uses C# null, not Python None"),
52
+ # optional 5th field = the user's sentence: a pin-driving action from a bare 'pin N' must ask board vs BCM
53
+ ({"action": "gpio_on", "pin": 11}, "pi", lambda p: p.action == "clarify" and "board pin 11" in p.note and "gpio 11" in p.note, "bare 'pin no 11' write -> clarify", "on windows 11 set pin no 11 high"),
54
+ ({"action": "gpio_toggle", "pin": 17}, "pi", lambda p: p.action == "clarify", "bare 'pin 17' toggle (caution) -> clarify", "pin 17 toggle karo"),
55
+ ({"action": "gpio_on", "pin": 17}, "pi", _has("pinctrl set 17 op dh"), "'gpio 17' write runs", "gpio 17 on karo"),
56
+ ({"action": "gpio_on", "pin": 11, "numbering": "board"}, "pi", _has("pinctrl set 17 op dh"), "'board pin 11' write runs", "board pin 11 pe led jalao"),
57
+ ({"action": "gpio_off", "pin": 21, "numbering": "board"}, "pi", lambda p: p.action == "gpio_off", "'40-pin header pin 21' write runs", "40-pin header pin 21 pe heater off karo"),
58
+ ({"action": "gpio_info", "pin": 11}, "pi", lambda p: p.action == "gpio_info", "bare pin on a safe read -> no clarify", "pin 11 input hai ya output"),
59
+ ]
60
+
61
+ def main(full):
62
+ t0 = time.time(); m = CommandModel(os.path.join(ROOT, "model"))
63
+ print(f"model: {sum(v.size for v in m.W.values())/1e6:.2f}M params, loaded in {time.time()-t0:.1f}s\n")
64
+ must_fail = 0; known_pass = 0; known = 0
65
+ print("== model parse ==")
66
+ for text, exp, level in MODEL_CASES:
67
+ out = m.predict(text); got = out["_meta"]["canonical"]; ok = got == exp
68
+ if level == "KNOWN":
69
+ known += 1; known_pass += ok; tag = "KNOWN-OK " if ok else "KNOWN-BAD"
70
+ else:
71
+ must_fail += not ok; tag = "PASS " if ok else "FAIL "
72
+ cmd = {k: v for k, v in out.items() if k != "_meta"}; pl = EX.plan(cmd, "pi", text)
73
+ extra = "" if ok else f" expected: {exp}"
74
+ print(f"{tag} {text}\n -> {got} [executor: {pl.action}{' - ' + pl.note if pl.action == 'clarify' else ''}]{extra}")
75
+ print("\n== executor ==")
76
+ for cmd, plat, pred, desc, *text in EXEC_CASES:
77
+ p = EX.plan(cmd, plat, text[0] if text else None)
78
+ try: ok = bool(pred(p))
79
+ except Exception as e: ok = False; desc += f" ({e})"
80
+ must_fail += not ok
81
+ print(f"{'PASS' if ok else 'FAIL'} [{plat}] {desc}" + ("" if ok else f"\n got: {p.action} {p.supported} {p.risk} {(p.command or p.note)[:160]}"))
82
+ if full:
83
+ for name, path in (("curated (one prompt per action)", os.path.join(HERE, "curated_prompts.jsonl")), ("wifi_holdout", os.path.join(HERE, "wifi_holdout.jsonl"))):
84
+ if not os.path.exists(path): continue
85
+ rows = [json.loads(l) for l in open(path, encoding="utf-8")]; t1 = time.time()
86
+ bad = [(r, m.predict(r["text"])["_meta"]["canonical"]) for r in rows]
87
+ bad = [(r, g) for r, g in bad if g != r["target"]]
88
+ acc = 1 - len(bad) / len(rows)
89
+ print(f"\n== {name}: exact {acc*100:.2f}% ({len(rows)-len(bad)}/{len(rows)}) in {time.time()-t1:.0f}s ==")
90
+ for r, g in bad[:10]: print(f" MISS {r['text']}\n got {g}\n exp {r['target']}")
91
+ print(f"\nsummary: MUST failures = {must_fail}; KNOWN phrasings fixed = {known_pass}/{known}")
92
+ sys.exit(1 if must_fail else 0)
93
+
94
+ if __name__ == "__main__": main("--full" in sys.argv)
eval/wifi_holdout.jsonl ADDED
@@ -0,0 +1,461 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"text": "bhai mere ghar ka wifi NETGEAR42 hai, password hai Password@1, connect kar do yaar", "target": "connect_wifi ssid=\"netgear42\" password=\"password@1\"", "action": "connect_wifi"}
2
+ {"text": "mere ghar ka wifi Sharma Ji Home hai, password hai jio#12345, connect kar do abhi", "target": "connect_wifi ssid=\"sharma ji home\" password=\"jio#12345\"", "action": "connect_wifi"}
3
+ {"text": "mere ghar ka wifi Home 2.4G hai, password hai ghar_ka_net1, connect kar do abhi", "target": "connect_wifi ssid=\"home 2.4g\" password=\"ghar_ka_net1\"", "action": "connect_wifi"}
4
+ {"text": "mere ghar ka wifi Tenda_8C21F0 hai, password hai Password@1, connect kar do jaldi", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"password@1\"", "action": "connect_wifi"}
5
+ {"text": "hey assistant mere ghar ka wifi Hostel Block B hai, password hai zxcv9087, connect kar do jaldi", "target": "connect_wifi ssid=\"hostel block b\" password=\"zxcv9087\"", "action": "connect_wifi"}
6
+ {"text": "please mere ghar ka wifi Hostel Block B hai, password hai jio#12345, connect kar do", "target": "connect_wifi ssid=\"hostel block b\" password=\"jio#12345\"", "action": "connect_wifi"}
7
+ {"text": "zara mere ghar ka wifi Office WiFi 5G hai, password hai Wifi@2024, connect kar do", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"wifi@2024\"", "action": "connect_wifi"}
8
+ {"text": "ok mere ghar ka wifi Room 204 hai, password hai zxcv9087, connect kar do", "target": "connect_wifi ssid=\"room 204\" password=\"zxcv9087\"", "action": "connect_wifi"}
9
+ {"text": "please mere ghar ka wifi Studio Wifi hai, password hai Welcome123, connect kar do please", "target": "connect_wifi ssid=\"studio wifi\" password=\"welcome123\"", "action": "connect_wifi"}
10
+ {"text": "mere ghar ka wifi Library-Guest hai, password hai Str0ng-P@ss, connect kar do yaar", "target": "connect_wifi ssid=\"library-guest\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
11
+ {"text": "ok mere ghar ka wifi Studio Wifi hai, password hai Guest@123, connect kar do yaar", "target": "connect_wifi ssid=\"studio wifi\" password=\"guest@123\"", "action": "connect_wifi"}
12
+ {"text": "please mere ghar ka wifi BSNL-FTTH-2291 hai, password hai Off!ce2024, connect kar do", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"off!ce2024\"", "action": "connect_wifi"}
13
+ {"text": "mere ghar ka wifi Kumar_House_2 hai, password hai Str0ng-P@ss, connect kar do jaldi", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
14
+ {"text": "mere ghar ka wifi Hathway_3F9C hai, password hai Library2026, connect kar do", "target": "connect_wifi ssid=\"hathway_3f9c\" password=\"library2026\"", "action": "connect_wifi"}
15
+ {"text": "mere ghar ka wifi MyNet hai, password hai Str0ng-P@ss, connect kar do", "target": "connect_wifi ssid=\"mynet\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
16
+ {"text": "please mere ghar ka wifi Office WiFi 5G hai, password hai N3tg3ar!, connect kar do please", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
17
+ {"text": "mere ghar ka wifi BSNL-FTTH-2291 hai, password hai Pass@word99, connect kar do", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"pass@word99\"", "action": "connect_wifi"}
18
+ {"text": "zara mere ghar ka wifi Tenda_8C21F0 hai, password hai Pass@word99, connect kar do", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"pass@word99\"", "action": "connect_wifi"}
19
+ {"text": "zara mere ghar ka wifi D-Link_DIR615 hai, password hai Library2026, connect kar do please", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"library2026\"", "action": "connect_wifi"}
20
+ {"text": "ok mere ghar ka wifi Vi_Home hai, password hai abc12345, connect kar do please", "target": "connect_wifi ssid=\"vi_home\" password=\"abc12345\"", "action": "connect_wifi"}
21
+ {"text": "mere ghar ka wifi Excitel-Pro 5G hai, password hai abc12345, connect kar do", "target": "connect_wifi ssid=\"excitel-pro 5g\" password=\"abc12345\"", "action": "connect_wifi"}
22
+ {"text": "mere ghar ka wifi HomeNet hai, password hai Cafe#Free77, connect kar do", "target": "connect_wifi ssid=\"homenet\" password=\"cafe#free77\"", "action": "connect_wifi"}
23
+ {"text": "mere ghar ka wifi Galaxy M31 hai, password hai Mehta&Sons9, connect kar do yaar", "target": "connect_wifi ssid=\"galaxy m31\" password=\"mehta&sons9\"", "action": "connect_wifi"}
24
+ {"text": "mere ghar ka wifi Library-Guest hai, password hai N3tg3ar!, connect kar do", "target": "connect_wifi ssid=\"library-guest\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
25
+ {"text": "ok mere ghar ka wifi Hathway_3F9C hai, password hai zxcv9087, connect kar do please", "target": "connect_wifi ssid=\"hathway_3f9c\" password=\"zxcv9087\"", "action": "connect_wifi"}
26
+ {"text": "zara mere ghar ka wifi Hostel Block B hai, password hai Password@1, connect kar do", "target": "connect_wifi ssid=\"hostel block b\" password=\"password@1\"", "action": "connect_wifi"}
27
+ {"text": "zara mere ghar ka wifi Library-Guest hai, password hai Kumar@1987, connect kar do", "target": "connect_wifi ssid=\"library-guest\" password=\"kumar@1987\"", "action": "connect_wifi"}
28
+ {"text": "mere ghar ka wifi Hathway_3F9C hai, password hai Kumar@1987, connect kar do abhi", "target": "connect_wifi ssid=\"hathway_3f9c\" password=\"kumar@1987\"", "action": "connect_wifi"}
29
+ {"text": "ok mere ghar ka wifi NETGEAR42 hai, password hai Guest@123, connect kar do please", "target": "connect_wifi ssid=\"netgear42\" password=\"guest@123\"", "action": "connect_wifi"}
30
+ {"text": "mere ghar ka wifi D-Link_DIR615 hai, password hai Cafe#Free77, connect kar do jaldi", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"cafe#free77\"", "action": "connect_wifi"}
31
+ {"text": "bhai mere ghar ka wifi iPhone of Ravi hai, password hai Password@1, connect kar do", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"password@1\"", "action": "connect_wifi"}
32
+ {"text": "please mere ghar ka wifi Vi_Home hai, password hai sharma#123, connect kar do please", "target": "connect_wifi ssid=\"vi_home\" password=\"sharma#123\"", "action": "connect_wifi"}
33
+ {"text": "bhai mere ghar ka wifi NETGEAR42 hai, password hai Hostel$2025, connect kar do", "target": "connect_wifi ssid=\"netgear42\" password=\"hostel$2025\"", "action": "connect_wifi"}
34
+ {"text": "jaldi mere ghar ka wifi Redmi Note 12 hai, password hai lalit.home7, connect kar do", "target": "connect_wifi ssid=\"redmi note 12\" password=\"lalit.home7\"", "action": "connect_wifi"}
35
+ {"text": "mere ghar ka wifi Home 2.4G hai, password hai Off!ce2024, connect kar do jaldi", "target": "connect_wifi ssid=\"home 2.4g\" password=\"off!ce2024\"", "action": "connect_wifi"}
36
+ {"text": "ok mere ghar ka wifi Room 204 hai, password hai Mehta&Sons9, connect kar do thanks", "target": "connect_wifi ssid=\"room 204\" password=\"mehta&sons9\"", "action": "connect_wifi"}
37
+ {"text": "please mere ghar ka wifi Cafe Coffee Day hai, password hai zxcv9087, connect kar do", "target": "connect_wifi ssid=\"cafe coffee day\" password=\"zxcv9087\"", "action": "connect_wifi"}
38
+ {"text": "please mere ghar ka wifi Vi_Home hai, password hai lalit.home7, connect kar do", "target": "connect_wifi ssid=\"vi_home\" password=\"lalit.home7\"", "action": "connect_wifi"}
39
+ {"text": "zara mere ghar ka wifi Room 204 hai, password hai qwerty!09, connect kar do abhi", "target": "connect_wifi ssid=\"room 204\" password=\"qwerty!09\"", "action": "connect_wifi"}
40
+ {"text": "bhai mere ghar ka wifi Hathway_3F9C hai, password hai Mehta&Sons9, connect kar do", "target": "connect_wifi ssid=\"hathway_3f9c\" password=\"mehta&sons9\"", "action": "connect_wifi"}
41
+ {"text": "mere ghar ka wifi Classroom WiFi hai, password hai Welcome123, connect kar do yaar", "target": "connect_wifi ssid=\"classroom wifi\" password=\"welcome123\"", "action": "connect_wifi"}
42
+ {"text": "mere ghar ka wifi Airtel_5G hai, password hai Off!ce2024, connect kar do yaar", "target": "connect_wifi ssid=\"airtel_5g\" password=\"off!ce2024\"", "action": "connect_wifi"}
43
+ {"text": "mere ghar ka wifi Hostel Block B hai, password hai sharma#123, connect kar do", "target": "connect_wifi ssid=\"hostel block b\" password=\"sharma#123\"", "action": "connect_wifi"}
44
+ {"text": "hey assistant mere ghar ka wifi JioFiber-Home hai, password hai Off!ce2024, connect kar do please", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"off!ce2024\"", "action": "connect_wifi"}
45
+ {"text": "jaldi mere ghar ka wifi iPhone of Ravi hai, password hai qwerty!09, connect kar do", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"qwerty!09\"", "action": "connect_wifi"}
46
+ {"text": "jaldi mere ghar ka wifi iPhone of Ravi hai, password hai Kumar@1987, connect kar do", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"kumar@1987\"", "action": "connect_wifi"}
47
+ {"text": "jaldi mere ghar ka wifi PiLab hai, password hai Mehta&Sons9, connect kar do", "target": "connect_wifi ssid=\"pilab\" password=\"mehta&sons9\"", "action": "connect_wifi"}
48
+ {"text": "zara mere ghar ka wifi TP-Link_A1B2 hai, password hai Cafe#Free77, connect kar do yaar", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"cafe#free77\"", "action": "connect_wifi"}
49
+ {"text": "mere ghar ka wifi Mehta_Family hai, password hai sharma#123, connect kar do jaldi", "target": "connect_wifi ssid=\"mehta_family\" password=\"sharma#123\"", "action": "connect_wifi"}
50
+ {"text": "zara mere ghar ka wifi NETGEAR42 hai, password hai Wifi@2024, connect kar do jaldi", "target": "connect_wifi ssid=\"netgear42\" password=\"wifi@2024\"", "action": "connect_wifi"}
51
+ {"text": "jaldi mere ghar ka wifi D-Link_DIR615 hai, password hai jio#12345, connect kar do thanks", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"jio#12345\"", "action": "connect_wifi"}
52
+ {"text": "mere ghar ka wifi Cafe Coffee Day hai, password hai sharma#123, connect kar do yaar", "target": "connect_wifi ssid=\"cafe coffee day\" password=\"sharma#123\"", "action": "connect_wifi"}
53
+ {"text": "mere ghar ka wifi Home 2.4G hai, password hai Wifi@2024, connect kar do", "target": "connect_wifi ssid=\"home 2.4g\" password=\"wifi@2024\"", "action": "connect_wifi"}
54
+ {"text": "mere ghar ka wifi Hostel Block B hai, password hai raVi_9988, connect kar do please", "target": "connect_wifi ssid=\"hostel block b\" password=\"ravi_9988\"", "action": "connect_wifi"}
55
+ {"text": "hey assistant mere ghar ka wifi Hostel Block B hai, password hai Library2026, connect kar do na", "target": "connect_wifi ssid=\"hostel block b\" password=\"library2026\"", "action": "connect_wifi"}
56
+ {"text": "mere ghar ka wifi Tenda_8C21F0 hai, password hai qwerty!09, connect kar do", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"qwerty!09\"", "action": "connect_wifi"}
57
+ {"text": "jaldi mere ghar ka wifi Tenda_8C21F0 hai, password hai Library2026, connect kar do na", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"library2026\"", "action": "connect_wifi"}
58
+ {"text": "mere ghar ka wifi TP-Link_A1B2 hai, password hai lalit.home7, connect kar do jaldi", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"lalit.home7\"", "action": "connect_wifi"}
59
+ {"text": "zara mere ghar ka wifi Tenda_8C21F0 hai, password hai Welcome123, connect kar do na", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"welcome123\"", "action": "connect_wifi"}
60
+ {"text": "mere ghar ka wifi Tenda_8C21F0 hai, password hai lalit.home7, connect kar do na", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"lalit.home7\"", "action": "connect_wifi"}
61
+ {"text": "jaldi ssid: Office WiFi 5G password: jio#12345 se jud jao please", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"jio#12345\"", "action": "connect_wifi"}
62
+ {"text": "ssid: Classroom WiFi password: pi-lab-2026 se jud jao thanks", "target": "connect_wifi ssid=\"classroom wifi\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
63
+ {"text": "bhai ssid: Library-Guest password: lalit.home7 se jud jao thanks", "target": "connect_wifi ssid=\"library-guest\" password=\"lalit.home7\"", "action": "connect_wifi"}
64
+ {"text": "ok ssid: Hathway_3F9C password: sharma#123 se jud jao please", "target": "connect_wifi ssid=\"hathway_3f9c\" password=\"sharma#123\"", "action": "connect_wifi"}
65
+ {"text": "bhai ssid: Sharma Ji Home password: pi-lab-2026 se jud jao", "target": "connect_wifi ssid=\"sharma ji home\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
66
+ {"text": "ssid: Tenda_8C21F0 password: abc12345 se jud jao na", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"abc12345\"", "action": "connect_wifi"}
67
+ {"text": "ssid: OnePlus Nord password: pi-lab-2026 se jud jao", "target": "connect_wifi ssid=\"oneplus nord\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
68
+ {"text": "bhai ssid: Office WiFi 5G password: zxcv9087 se jud jao", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"zxcv9087\"", "action": "connect_wifi"}
69
+ {"text": "ssid: BSNL-FTTH-2291 password: Off!ce2024 se jud jao", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"off!ce2024\"", "action": "connect_wifi"}
70
+ {"text": "ssid: Studio Wifi password: lalit.home7 se jud jao na", "target": "connect_wifi ssid=\"studio wifi\" password=\"lalit.home7\"", "action": "connect_wifi"}
71
+ {"text": "please ssid: JioFiber-Home password: qwerty!09 se jud jao yaar", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"qwerty!09\"", "action": "connect_wifi"}
72
+ {"text": "zara ssid: Library-Guest password: HomeSweet#88 se jud jao", "target": "connect_wifi ssid=\"library-guest\" password=\"homesweet#88\"", "action": "connect_wifi"}
73
+ {"text": "ssid: MyNet password: Off!ce2024 se jud jao please", "target": "connect_wifi ssid=\"mynet\" password=\"off!ce2024\"", "action": "connect_wifi"}
74
+ {"text": "ssid: ACT_Fibernet_7 password: ghar_ka_net1 se jud jao na", "target": "connect_wifi ssid=\"act_fibernet_7\" password=\"ghar_ka_net1\"", "action": "connect_wifi"}
75
+ {"text": "zara ssid: Airtel_5G password: Guest@123 se jud jao thanks", "target": "connect_wifi ssid=\"airtel_5g\" password=\"guest@123\"", "action": "connect_wifi"}
76
+ {"text": "ssid: BSNL-FTTH-2291 password: Str0ng-P@ss se jud jao", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
77
+ {"text": "ssid: Redmi Note 12 password: abc12345 se jud jao", "target": "connect_wifi ssid=\"redmi note 12\" password=\"abc12345\"", "action": "connect_wifi"}
78
+ {"text": "bhai ssid: TP-Link_A1B2 password: Hostel$2025 se jud jao na", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"hostel$2025\"", "action": "connect_wifi"}
79
+ {"text": "please ssid: Mehta_Family password: qwerty!09 se jud jao jaldi", "target": "connect_wifi ssid=\"mehta_family\" password=\"qwerty!09\"", "action": "connect_wifi"}
80
+ {"text": "ssid: Library-Guest password: abc12345 se jud jao", "target": "connect_wifi ssid=\"library-guest\" password=\"abc12345\"", "action": "connect_wifi"}
81
+ {"text": "ssid: Studio Wifi password: qwerty!09 se jud jao", "target": "connect_wifi ssid=\"studio wifi\" password=\"qwerty!09\"", "action": "connect_wifi"}
82
+ {"text": "ssid: Office WiFi 5G password: Cafe#Free77 se jud jao", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"cafe#free77\"", "action": "connect_wifi"}
83
+ {"text": "please ssid: Classroom WiFi password: raVi_9988 se jud jao", "target": "connect_wifi ssid=\"classroom wifi\" password=\"ravi_9988\"", "action": "connect_wifi"}
84
+ {"text": "ssid: Hathway_3F9C password: 9876543210 se jud jao please", "target": "connect_wifi ssid=\"hathway_3f9c\" password=\"9876543210\"", "action": "connect_wifi"}
85
+ {"text": "ssid: PiLab password: N3tg3ar! se jud jao please", "target": "connect_wifi ssid=\"pilab\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
86
+ {"text": "jaldi ssid: Home 2.4G password: Kumar@1987 se jud jao abhi", "target": "connect_wifi ssid=\"home 2.4g\" password=\"kumar@1987\"", "action": "connect_wifi"}
87
+ {"text": "ok ssid: Mehta_Family password: Library2026 se jud jao abhi", "target": "connect_wifi ssid=\"mehta_family\" password=\"library2026\"", "action": "connect_wifi"}
88
+ {"text": "bhai ssid: Mehta_Family password: abc12345 se jud jao", "target": "connect_wifi ssid=\"mehta_family\" password=\"abc12345\"", "action": "connect_wifi"}
89
+ {"text": "bhai ssid: BSNL-FTTH-2291 password: HomeSweet#88 se jud jao", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"homesweet#88\"", "action": "connect_wifi"}
90
+ {"text": "ssid: Redmi Note 12 password: HomeSweet#88 se jud jao thanks", "target": "connect_wifi ssid=\"redmi note 12\" password=\"homesweet#88\"", "action": "connect_wifi"}
91
+ {"text": "hey assistant ssid: Sharma Ji Home password: Library2026 se jud jao na", "target": "connect_wifi ssid=\"sharma ji home\" password=\"library2026\"", "action": "connect_wifi"}
92
+ {"text": "please ssid: Cafe Coffee Day password: N3tg3ar! se jud jao", "target": "connect_wifi ssid=\"cafe coffee day\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
93
+ {"text": "ssid: Studio Wifi password: Cafe#Free77 se jud jao yaar", "target": "connect_wifi ssid=\"studio wifi\" password=\"cafe#free77\"", "action": "connect_wifi"}
94
+ {"text": "ssid: PiLab password: Pass@word99 se jud jao na", "target": "connect_wifi ssid=\"pilab\" password=\"pass@word99\"", "action": "connect_wifi"}
95
+ {"text": "ssid: Office WiFi 5G password: qwerty!09 se jud jao jaldi", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"qwerty!09\"", "action": "connect_wifi"}
96
+ {"text": "please ssid: TP-Link_A1B2 password: Password@1 se jud jao please", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"password@1\"", "action": "connect_wifi"}
97
+ {"text": "ssid: Home 2.4G password: sharma#123 se jud jao please", "target": "connect_wifi ssid=\"home 2.4g\" password=\"sharma#123\"", "action": "connect_wifi"}
98
+ {"text": "ssid: NETGEAR42 password: Str0ng-P@ss se jud jao", "target": "connect_wifi ssid=\"netgear42\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
99
+ {"text": "jaldi ssid: Room 204 password: N3tg3ar! se jud jao abhi", "target": "connect_wifi ssid=\"room 204\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
100
+ {"text": "ssid: D-Link_DIR615 password: lalit.home7 se jud jao", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"lalit.home7\"", "action": "connect_wifi"}
101
+ {"text": "ssid: Mehta_Family password: Off!ce2024 se jud jao thanks", "target": "connect_wifi ssid=\"mehta_family\" password=\"off!ce2024\"", "action": "connect_wifi"}
102
+ {"text": "hey assistant ssid: Mehta_Family password: lalit.home7 se jud jao jaldi", "target": "connect_wifi ssid=\"mehta_family\" password=\"lalit.home7\"", "action": "connect_wifi"}
103
+ {"text": "bhai ssid: Tenda_8C21F0 password: N3tg3ar! se jud jao thanks", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
104
+ {"text": "jaldi ssid: Tenda_8C21F0 password: Kumar@1987 se jud jao na", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"kumar@1987\"", "action": "connect_wifi"}
105
+ {"text": "zara ssid: Mehta_Family password: Wifi@2024 se jud jao thanks", "target": "connect_wifi ssid=\"mehta_family\" password=\"wifi@2024\"", "action": "connect_wifi"}
106
+ {"text": "please ssid: Room 204 password: ghar_ka_net1 se jud jao", "target": "connect_wifi ssid=\"room 204\" password=\"ghar_ka_net1\"", "action": "connect_wifi"}
107
+ {"text": "ok ssid: Excitel-Pro 5G password: pi-lab-2026 se jud jao", "target": "connect_wifi ssid=\"excitel-pro 5g\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
108
+ {"text": "ssid: TP-Link_A1B2 password: zxcv9087 se jud jao", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"zxcv9087\"", "action": "connect_wifi"}
109
+ {"text": "hey assistant ssid: Airtel_5G password: Cafe#Free77 se jud jao please", "target": "connect_wifi ssid=\"airtel_5g\" password=\"cafe#free77\"", "action": "connect_wifi"}
110
+ {"text": "jaldi ssid: Sharma Ji Home password: Wifi@2024 se jud jao na", "target": "connect_wifi ssid=\"sharma ji home\" password=\"wifi@2024\"", "action": "connect_wifi"}
111
+ {"text": "zara ssid: Home 2.4G password: Pass@word99 se jud jao jaldi", "target": "connect_wifi ssid=\"home 2.4g\" password=\"pass@word99\"", "action": "connect_wifi"}
112
+ {"text": "ssid: Hostel Block B password: zxcv9087 se jud jao jaldi", "target": "connect_wifi ssid=\"hostel block b\" password=\"zxcv9087\"", "action": "connect_wifi"}
113
+ {"text": "please ssid: MyNet password: Str0ng-P@ss se jud jao na", "target": "connect_wifi ssid=\"mynet\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
114
+ {"text": "zara ssid: JioFiber-Home password: Pass@word99 se jud jao", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"pass@word99\"", "action": "connect_wifi"}
115
+ {"text": "hey assistant ssid: ACT_Fibernet_7 password: 9876543210 se jud jao", "target": "connect_wifi ssid=\"act_fibernet_7\" password=\"9876543210\"", "action": "connect_wifi"}
116
+ {"text": "please ssid: JioFiber-Home password: zxcv9087 se jud jao", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"zxcv9087\"", "action": "connect_wifi"}
117
+ {"text": "ssid: Studio Wifi password: Password@1 se jud jao yaar", "target": "connect_wifi ssid=\"studio wifi\" password=\"password@1\"", "action": "connect_wifi"}
118
+ {"text": "ok ssid: TP-Link_A1B2 password: lalit.home7 se jud jao yaar", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"lalit.home7\"", "action": "connect_wifi"}
119
+ {"text": "ssid: Airtel_5G password: HomeSweet#88 se jud jao abhi", "target": "connect_wifi ssid=\"airtel_5g\" password=\"homesweet#88\"", "action": "connect_wifi"}
120
+ {"text": "ok ssid: Room 204 password: abc12345 se jud jao please", "target": "connect_wifi ssid=\"room 204\" password=\"abc12345\"", "action": "connect_wifi"}
121
+ {"text": "password Welcome123 hai aur wifi Office WiFi 5G hai, connect kar do please", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"welcome123\"", "action": "connect_wifi"}
122
+ {"text": "password zxcv9087 hai aur wifi Galaxy M31 hai, connect kar do jaldi", "target": "connect_wifi ssid=\"galaxy m31\" password=\"zxcv9087\"", "action": "connect_wifi"}
123
+ {"text": "zara password Wifi@2024 hai aur wifi OnePlus Nord hai, connect kar do please", "target": "connect_wifi ssid=\"oneplus nord\" password=\"wifi@2024\"", "action": "connect_wifi"}
124
+ {"text": "bhai password Off!ce2024 hai aur wifi MyNet hai, connect kar do yaar", "target": "connect_wifi ssid=\"mynet\" password=\"off!ce2024\"", "action": "connect_wifi"}
125
+ {"text": "bhai password Password@1 hai aur wifi Classroom WiFi hai, connect kar do", "target": "connect_wifi ssid=\"classroom wifi\" password=\"password@1\"", "action": "connect_wifi"}
126
+ {"text": "ok password abc12345 hai aur wifi Classroom WiFi hai, connect kar do jaldi", "target": "connect_wifi ssid=\"classroom wifi\" password=\"abc12345\"", "action": "connect_wifi"}
127
+ {"text": "jaldi password qwerty!09 hai aur wifi Guest_Network hai, connect kar do thanks", "target": "connect_wifi ssid=\"guest_network\" password=\"qwerty!09\"", "action": "connect_wifi"}
128
+ {"text": "please password zxcv9087 hai aur wifi Classroom WiFi hai, connect kar do", "target": "connect_wifi ssid=\"classroom wifi\" password=\"zxcv9087\"", "action": "connect_wifi"}
129
+ {"text": "zara password Wifi@2024 hai aur wifi BSNL-FTTH-2291 hai, connect kar do", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"wifi@2024\"", "action": "connect_wifi"}
130
+ {"text": "bhai password Wifi@2024 hai aur wifi Tenda_8C21F0 hai, connect kar do jaldi", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"wifi@2024\"", "action": "connect_wifi"}
131
+ {"text": "please password zxcv9087 hai aur wifi Sharma Ji Home hai, connect kar do thanks", "target": "connect_wifi ssid=\"sharma ji home\" password=\"zxcv9087\"", "action": "connect_wifi"}
132
+ {"text": "hey assistant password ghar_ka_net1 hai aur wifi Cafe Coffee Day hai, connect kar do na", "target": "connect_wifi ssid=\"cafe coffee day\" password=\"ghar_ka_net1\"", "action": "connect_wifi"}
133
+ {"text": "zara password HomeSweet#88 hai aur wifi Cafe Coffee Day hai, connect kar do", "target": "connect_wifi ssid=\"cafe coffee day\" password=\"homesweet#88\"", "action": "connect_wifi"}
134
+ {"text": "bhai password 9876543210 hai aur wifi OnePlus Nord hai, connect kar do abhi", "target": "connect_wifi ssid=\"oneplus nord\" password=\"9876543210\"", "action": "connect_wifi"}
135
+ {"text": "password Kumar@1987 hai aur wifi Studio Wifi hai, connect kar do please", "target": "connect_wifi ssid=\"studio wifi\" password=\"kumar@1987\"", "action": "connect_wifi"}
136
+ {"text": "hey assistant password Library2026 hai aur wifi Home 2.4G hai, connect kar do", "target": "connect_wifi ssid=\"home 2.4g\" password=\"library2026\"", "action": "connect_wifi"}
137
+ {"text": "bhai password ghar_ka_net1 hai aur wifi Vi_Home hai, connect kar do", "target": "connect_wifi ssid=\"vi_home\" password=\"ghar_ka_net1\"", "action": "connect_wifi"}
138
+ {"text": "please password Off!ce2024 hai aur wifi Library-Guest hai, connect kar do", "target": "connect_wifi ssid=\"library-guest\" password=\"off!ce2024\"", "action": "connect_wifi"}
139
+ {"text": "password HomeSweet#88 hai aur wifi Galaxy M31 hai, connect kar do", "target": "connect_wifi ssid=\"galaxy m31\" password=\"homesweet#88\"", "action": "connect_wifi"}
140
+ {"text": "password ghar_ka_net1 hai aur wifi HomeNet hai, connect kar do jaldi", "target": "connect_wifi ssid=\"homenet\" password=\"ghar_ka_net1\"", "action": "connect_wifi"}
141
+ {"text": "zara password pi-lab-2026 hai aur wifi BSNL-FTTH-2291 hai, connect kar do na", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
142
+ {"text": "ok password N3tg3ar! hai aur wifi JioFiber-Home hai, connect kar do thanks", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
143
+ {"text": "zara password Pass@word99 hai aur wifi OnePlus Nord hai, connect kar do na", "target": "connect_wifi ssid=\"oneplus nord\" password=\"pass@word99\"", "action": "connect_wifi"}
144
+ {"text": "zara password zxcv9087 hai aur wifi Hostel Block B hai, connect kar do", "target": "connect_wifi ssid=\"hostel block b\" password=\"zxcv9087\"", "action": "connect_wifi"}
145
+ {"text": "bhai password lalit.home7 hai aur wifi Classroom WiFi hai, connect kar do", "target": "connect_wifi ssid=\"classroom wifi\" password=\"lalit.home7\"", "action": "connect_wifi"}
146
+ {"text": "ok password HomeSweet#88 hai aur wifi iPhone of Ravi hai, connect kar do yaar", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"homesweet#88\"", "action": "connect_wifi"}
147
+ {"text": "hey assistant password Library2026 hai aur wifi HomeNet hai, connect kar do jaldi", "target": "connect_wifi ssid=\"homenet\" password=\"library2026\"", "action": "connect_wifi"}
148
+ {"text": "password Mehta&Sons9 hai aur wifi iPhone of Ravi hai, connect kar do", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"mehta&sons9\"", "action": "connect_wifi"}
149
+ {"text": "please password Off!ce2024 hai aur wifi Studio Wifi hai, connect kar do thanks", "target": "connect_wifi ssid=\"studio wifi\" password=\"off!ce2024\"", "action": "connect_wifi"}
150
+ {"text": "please password Guest@123 hai aur wifi BSNL-FTTH-2291 hai, connect kar do na", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"guest@123\"", "action": "connect_wifi"}
151
+ {"text": "please password N3tg3ar! hai aur wifi Redmi Note 12 hai, connect kar do", "target": "connect_wifi ssid=\"redmi note 12\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
152
+ {"text": "bhai password pi-lab-2026 hai aur wifi TP-Link_A1B2 hai, connect kar do yaar", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
153
+ {"text": "zara password Cafe#Free77 hai aur wifi Studio Wifi hai, connect kar do jaldi", "target": "connect_wifi ssid=\"studio wifi\" password=\"cafe#free77\"", "action": "connect_wifi"}
154
+ {"text": "please password Library2026 hai aur wifi MyNet hai, connect kar do", "target": "connect_wifi ssid=\"mynet\" password=\"library2026\"", "action": "connect_wifi"}
155
+ {"text": "bhai password N3tg3ar! hai aur wifi BSNL-FTTH-2291 hai, connect kar do yaar", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
156
+ {"text": "bhai password jio#12345 hai aur wifi Sharma Ji Home hai, connect kar do abhi", "target": "connect_wifi ssid=\"sharma ji home\" password=\"jio#12345\"", "action": "connect_wifi"}
157
+ {"text": "hey assistant password Off!ce2024 hai aur wifi Kumar_House_2 hai, connect kar do thanks", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"off!ce2024\"", "action": "connect_wifi"}
158
+ {"text": "password Off!ce2024 hai aur wifi Guest_Network hai, connect kar do", "target": "connect_wifi ssid=\"guest_network\" password=\"off!ce2024\"", "action": "connect_wifi"}
159
+ {"text": "jaldi password 9876543210 hai aur wifi Tenda_8C21F0 hai, connect kar do thanks", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"9876543210\"", "action": "connect_wifi"}
160
+ {"text": "jaldi password Off!ce2024 hai aur wifi Guest_Network hai, connect kar do", "target": "connect_wifi ssid=\"guest_network\" password=\"off!ce2024\"", "action": "connect_wifi"}
161
+ {"text": "zara password Kumar@1987 hai aur wifi D-Link_DIR615 hai, connect kar do abhi", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"kumar@1987\"", "action": "connect_wifi"}
162
+ {"text": "ok password Str0ng-P@ss hai aur wifi Redmi Note 12 hai, connect kar do thanks", "target": "connect_wifi ssid=\"redmi note 12\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
163
+ {"text": "bhai password Hostel$2025 hai aur wifi NETGEAR42 hai, connect kar do na", "target": "connect_wifi ssid=\"netgear42\" password=\"hostel$2025\"", "action": "connect_wifi"}
164
+ {"text": "bhai password Library2026 hai aur wifi MyNet hai, connect kar do", "target": "connect_wifi ssid=\"mynet\" password=\"library2026\"", "action": "connect_wifi"}
165
+ {"text": "hey assistant password lalit.home7 hai aur wifi Classroom WiFi hai, connect kar do please", "target": "connect_wifi ssid=\"classroom wifi\" password=\"lalit.home7\"", "action": "connect_wifi"}
166
+ {"text": "password Wifi@2024 hai aur wifi JioFiber-Home hai, connect kar do na", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"wifi@2024\"", "action": "connect_wifi"}
167
+ {"text": "ok password jio#12345 hai aur wifi JioFiber-Home hai, connect kar do yaar", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"jio#12345\"", "action": "connect_wifi"}
168
+ {"text": "jaldi password Library2026 hai aur wifi Cafe Coffee Day hai, connect kar do jaldi", "target": "connect_wifi ssid=\"cafe coffee day\" password=\"library2026\"", "action": "connect_wifi"}
169
+ {"text": "bhai password pi-lab-2026 hai aur wifi Kumar_House_2 hai, connect kar do thanks", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
170
+ {"text": "zara password Guest@123 hai aur wifi Mehta_Family hai, connect kar do thanks", "target": "connect_wifi ssid=\"mehta_family\" password=\"guest@123\"", "action": "connect_wifi"}
171
+ {"text": "zara password N3tg3ar! hai aur wifi Guest_Network hai, connect kar do thanks", "target": "connect_wifi ssid=\"guest_network\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
172
+ {"text": "password abc12345 hai aur wifi Vi_Home hai, connect kar do please", "target": "connect_wifi ssid=\"vi_home\" password=\"abc12345\"", "action": "connect_wifi"}
173
+ {"text": "password pi-lab-2026 hai aur wifi Excitel-Pro 5G hai, connect kar do", "target": "connect_wifi ssid=\"excitel-pro 5g\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
174
+ {"text": "bhai password 9876543210 hai aur wifi iPhone of Ravi hai, connect kar do yaar", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"9876543210\"", "action": "connect_wifi"}
175
+ {"text": "password sharma#123 hai aur wifi HomeNet hai, connect kar do yaar", "target": "connect_wifi ssid=\"homenet\" password=\"sharma#123\"", "action": "connect_wifi"}
176
+ {"text": "hey assistant password Welcome123 hai aur wifi JioFiber-Home hai, connect kar do abhi", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"welcome123\"", "action": "connect_wifi"}
177
+ {"text": "please password sharma#123 hai aur wifi Cafe Coffee Day hai, connect kar do", "target": "connect_wifi ssid=\"cafe coffee day\" password=\"sharma#123\"", "action": "connect_wifi"}
178
+ {"text": "password Welcome123 hai aur wifi Galaxy M31 hai, connect kar do", "target": "connect_wifi ssid=\"galaxy m31\" password=\"welcome123\"", "action": "connect_wifi"}
179
+ {"text": "password Off!ce2024 hai aur wifi Classroom WiFi hai, connect kar do please", "target": "connect_wifi ssid=\"classroom wifi\" password=\"off!ce2024\"", "action": "connect_wifi"}
180
+ {"text": "password Kumar@1987 hai aur wifi Hathway_3F9C hai, connect kar do na", "target": "connect_wifi ssid=\"hathway_3f9c\" password=\"kumar@1987\"", "action": "connect_wifi"}
181
+ {"text": "jaldi office ka wifi Galaxy M31 hai uska pass Pass@word99 hai jod do", "target": "connect_wifi ssid=\"galaxy m31\" password=\"pass@word99\"", "action": "connect_wifi"}
182
+ {"text": "hey assistant office ka wifi JioFiber-Home hai uska pass Library2026 hai jod do please", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"library2026\"", "action": "connect_wifi"}
183
+ {"text": "zara office ka wifi TP-Link_A1B2 hai uska pass Password@1 hai jod do", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"password@1\"", "action": "connect_wifi"}
184
+ {"text": "jaldi office ka wifi Sharma Ji Home hai uska pass Hostel$2025 hai jod do na", "target": "connect_wifi ssid=\"sharma ji home\" password=\"hostel$2025\"", "action": "connect_wifi"}
185
+ {"text": "hey assistant office ka wifi Mehta_Family hai uska pass Library2026 hai jod do", "target": "connect_wifi ssid=\"mehta_family\" password=\"library2026\"", "action": "connect_wifi"}
186
+ {"text": "jaldi office ka wifi PiLab hai uska pass Hostel$2025 hai jod do", "target": "connect_wifi ssid=\"pilab\" password=\"hostel$2025\"", "action": "connect_wifi"}
187
+ {"text": "bhai office ka wifi Studio Wifi hai uska pass jio#12345 hai jod do jaldi", "target": "connect_wifi ssid=\"studio wifi\" password=\"jio#12345\"", "action": "connect_wifi"}
188
+ {"text": "office ka wifi Tenda_8C21F0 hai uska pass Guest@123 hai jod do thanks", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"guest@123\"", "action": "connect_wifi"}
189
+ {"text": "office ka wifi OnePlus Nord hai uska pass Pass@word99 hai jod do jaldi", "target": "connect_wifi ssid=\"oneplus nord\" password=\"pass@word99\"", "action": "connect_wifi"}
190
+ {"text": "zara office ka wifi Vi_Home hai uska pass raVi_9988 hai jod do na", "target": "connect_wifi ssid=\"vi_home\" password=\"ravi_9988\"", "action": "connect_wifi"}
191
+ {"text": "please office ka wifi Excitel-Pro 5G hai uska pass pi-lab-2026 hai jod do jaldi", "target": "connect_wifi ssid=\"excitel-pro 5g\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
192
+ {"text": "zara office ka wifi Guest_Network hai uska pass zxcv9087 hai jod do na", "target": "connect_wifi ssid=\"guest_network\" password=\"zxcv9087\"", "action": "connect_wifi"}
193
+ {"text": "ok office ka wifi Kumar_House_2 hai uska pass N3tg3ar! hai jod do jaldi", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
194
+ {"text": "office ka wifi Library-Guest hai uska pass Pass@word99 hai jod do abhi", "target": "connect_wifi ssid=\"library-guest\" password=\"pass@word99\"", "action": "connect_wifi"}
195
+ {"text": "hey assistant office ka wifi Mehta_Family hai uska pass Cafe#Free77 hai jod do", "target": "connect_wifi ssid=\"mehta_family\" password=\"cafe#free77\"", "action": "connect_wifi"}
196
+ {"text": "office ka wifi Kumar_House_2 hai uska pass Cafe#Free77 hai jod do yaar", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"cafe#free77\"", "action": "connect_wifi"}
197
+ {"text": "bhai office ka wifi OnePlus Nord hai uska pass Welcome123 hai jod do", "target": "connect_wifi ssid=\"oneplus nord\" password=\"welcome123\"", "action": "connect_wifi"}
198
+ {"text": "office ka wifi ACT_Fibernet_7 hai uska pass 9876543210 hai jod do na", "target": "connect_wifi ssid=\"act_fibernet_7\" password=\"9876543210\"", "action": "connect_wifi"}
199
+ {"text": "office ka wifi Hathway_3F9C hai uska pass pi-lab-2026 hai jod do jaldi", "target": "connect_wifi ssid=\"hathway_3f9c\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
200
+ {"text": "office ka wifi MyNet hai uska pass Library2026 hai jod do thanks", "target": "connect_wifi ssid=\"mynet\" password=\"library2026\"", "action": "connect_wifi"}
201
+ {"text": "office ka wifi Classroom WiFi hai uska pass Kumar@1987 hai jod do thanks", "target": "connect_wifi ssid=\"classroom wifi\" password=\"kumar@1987\"", "action": "connect_wifi"}
202
+ {"text": "zara office ka wifi Office WiFi 5G hai uska pass abc12345 hai jod do", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"abc12345\"", "action": "connect_wifi"}
203
+ {"text": "office ka wifi HomeNet hai uska pass Guest@123 hai jod do", "target": "connect_wifi ssid=\"homenet\" password=\"guest@123\"", "action": "connect_wifi"}
204
+ {"text": "bhai office ka wifi Guest_Network hai uska pass N3tg3ar! hai jod do yaar", "target": "connect_wifi ssid=\"guest_network\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
205
+ {"text": "office ka wifi Library-Guest hai uska pass raVi_9988 hai jod do please", "target": "connect_wifi ssid=\"library-guest\" password=\"ravi_9988\"", "action": "connect_wifi"}
206
+ {"text": "office ka wifi Studio Wifi hai uska pass N3tg3ar! hai jod do thanks", "target": "connect_wifi ssid=\"studio wifi\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
207
+ {"text": "hey assistant office ka wifi Vi_Home hai uska pass 9876543210 hai jod do", "target": "connect_wifi ssid=\"vi_home\" password=\"9876543210\"", "action": "connect_wifi"}
208
+ {"text": "hey assistant office ka wifi Redmi Note 12 hai uska pass N3tg3ar! hai jod do thanks", "target": "connect_wifi ssid=\"redmi note 12\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
209
+ {"text": "office ka wifi ACT_Fibernet_7 hai uska pass Guest@123 hai jod do abhi", "target": "connect_wifi ssid=\"act_fibernet_7\" password=\"guest@123\"", "action": "connect_wifi"}
210
+ {"text": "office ka wifi HomeNet hai uska pass raVi_9988 hai jod do", "target": "connect_wifi ssid=\"homenet\" password=\"ravi_9988\"", "action": "connect_wifi"}
211
+ {"text": "zara office ka wifi Hostel Block B hai uska pass Hostel$2025 hai jod do yaar", "target": "connect_wifi ssid=\"hostel block b\" password=\"hostel$2025\"", "action": "connect_wifi"}
212
+ {"text": "ok office ka wifi JioFiber-Home hai uska pass ghar_ka_net1 hai jod do thanks", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"ghar_ka_net1\"", "action": "connect_wifi"}
213
+ {"text": "please office ka wifi ACT_Fibernet_7 hai uska pass Password@1 hai jod do yaar", "target": "connect_wifi ssid=\"act_fibernet_7\" password=\"password@1\"", "action": "connect_wifi"}
214
+ {"text": "please office ka wifi Sharma Ji Home hai uska pass zxcv9087 hai jod do yaar", "target": "connect_wifi ssid=\"sharma ji home\" password=\"zxcv9087\"", "action": "connect_wifi"}
215
+ {"text": "zara office ka wifi JioFiber-Home hai uska pass lalit.home7 hai jod do thanks", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"lalit.home7\"", "action": "connect_wifi"}
216
+ {"text": "office ka wifi Vi_Home hai uska pass Guest@123 hai jod do jaldi", "target": "connect_wifi ssid=\"vi_home\" password=\"guest@123\"", "action": "connect_wifi"}
217
+ {"text": "please office ka wifi iPhone of Ravi hai uska pass N3tg3ar! hai jod do", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
218
+ {"text": "bhai office ka wifi Room 204 hai uska pass N3tg3ar! hai jod do", "target": "connect_wifi ssid=\"room 204\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
219
+ {"text": "hey assistant office ka wifi Galaxy M31 hai uska pass 9876543210 hai jod do", "target": "connect_wifi ssid=\"galaxy m31\" password=\"9876543210\"", "action": "connect_wifi"}
220
+ {"text": "jaldi office ka wifi Studio Wifi hai uska pass HomeSweet#88 hai jod do yaar", "target": "connect_wifi ssid=\"studio wifi\" password=\"homesweet#88\"", "action": "connect_wifi"}
221
+ {"text": "office ka wifi Home 2.4G hai uska pass Str0ng-P@ss hai jod do na", "target": "connect_wifi ssid=\"home 2.4g\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
222
+ {"text": "office ka wifi ACT_Fibernet_7 hai uska pass ghar_ka_net1 hai jod do please", "target": "connect_wifi ssid=\"act_fibernet_7\" password=\"ghar_ka_net1\"", "action": "connect_wifi"}
223
+ {"text": "office ka wifi TP-Link_A1B2 hai uska pass Mehta&Sons9 hai jod do", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"mehta&sons9\"", "action": "connect_wifi"}
224
+ {"text": "office ka wifi BSNL-FTTH-2291 hai uska pass Password@1 hai jod do please", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"password@1\"", "action": "connect_wifi"}
225
+ {"text": "zara office ka wifi Airtel_5G hai uska pass Str0ng-P@ss hai jod do jaldi", "target": "connect_wifi ssid=\"airtel_5g\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
226
+ {"text": "jaldi office ka wifi Excitel-Pro 5G hai uska pass Pass@word99 hai jod do abhi", "target": "connect_wifi ssid=\"excitel-pro 5g\" password=\"pass@word99\"", "action": "connect_wifi"}
227
+ {"text": "jaldi office ka wifi TP-Link_A1B2 hai uska pass HomeSweet#88 hai jod do thanks", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"homesweet#88\"", "action": "connect_wifi"}
228
+ {"text": "bhai office ka wifi Guest_Network hai uska pass Pass@word99 hai jod do jaldi", "target": "connect_wifi ssid=\"guest_network\" password=\"pass@word99\"", "action": "connect_wifi"}
229
+ {"text": "office ka wifi ACT_Fibernet_7 hai uska pass Hostel$2025 hai jod do", "target": "connect_wifi ssid=\"act_fibernet_7\" password=\"hostel$2025\"", "action": "connect_wifi"}
230
+ {"text": "office ka wifi Library-Guest hai uska pass zxcv9087 hai jod do na", "target": "connect_wifi ssid=\"library-guest\" password=\"zxcv9087\"", "action": "connect_wifi"}
231
+ {"text": "hey assistant office ka wifi Kumar_House_2 hai uska pass raVi_9988 hai jod do", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"ravi_9988\"", "action": "connect_wifi"}
232
+ {"text": "ok office ka wifi OnePlus Nord hai uska pass 9876543210 hai jod do please", "target": "connect_wifi ssid=\"oneplus nord\" password=\"9876543210\"", "action": "connect_wifi"}
233
+ {"text": "office ka wifi Office WiFi 5G hai uska pass sharma#123 hai jod do jaldi", "target": "connect_wifi ssid=\"office wifi 5g\" password=\"sharma#123\"", "action": "connect_wifi"}
234
+ {"text": "ok office ka wifi OnePlus Nord hai uska pass N3tg3ar! hai jod do thanks", "target": "connect_wifi ssid=\"oneplus nord\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
235
+ {"text": "bhai office ka wifi BSNL-FTTH-2291 hai uska pass N3tg3ar! hai jod do jaldi", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
236
+ {"text": "office ka wifi MyNet hai uska pass Hostel$2025 hai jod do yaar", "target": "connect_wifi ssid=\"mynet\" password=\"hostel$2025\"", "action": "connect_wifi"}
237
+ {"text": "hey assistant office ka wifi Cafe Coffee Day hai uska pass raVi_9988 hai jod do yaar", "target": "connect_wifi ssid=\"cafe coffee day\" password=\"ravi_9988\"", "action": "connect_wifi"}
238
+ {"text": "bhai office ka wifi TP-Link_A1B2 hai uska pass HomeSweet#88 hai jod do yaar", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"homesweet#88\"", "action": "connect_wifi"}
239
+ {"text": "jaldi office ka wifi iPhone of Ravi hai uska pass Str0ng-P@ss hai jod do jaldi", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
240
+ {"text": "office ka wifi BSNL-FTTH-2291 hai uska pass Hostel$2025 hai jod do jaldi", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"hostel$2025\"", "action": "connect_wifi"}
241
+ {"text": "laptop ko wifi Sharma Ji Home pe lagao pass Hostel$2025 please", "target": "connect_wifi ssid=\"sharma ji home\" password=\"hostel$2025\"", "action": "connect_wifi"}
242
+ {"text": "please laptop ko wifi Classroom WiFi pe lagao pass Mehta&Sons9 thanks", "target": "connect_wifi ssid=\"classroom wifi\" password=\"mehta&sons9\"", "action": "connect_wifi"}
243
+ {"text": "bhai laptop ko wifi Library-Guest pe lagao pass qwerty!09 jaldi", "target": "connect_wifi ssid=\"library-guest\" password=\"qwerty!09\"", "action": "connect_wifi"}
244
+ {"text": "jaldi laptop ko wifi Kumar_House_2 pe lagao pass lalit.home7 please", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"lalit.home7\"", "action": "connect_wifi"}
245
+ {"text": "jaldi laptop ko wifi Studio Wifi pe lagao pass Wifi@2024 thanks", "target": "connect_wifi ssid=\"studio wifi\" password=\"wifi@2024\"", "action": "connect_wifi"}
246
+ {"text": "laptop ko wifi Guest_Network pe lagao pass sharma#123 abhi", "target": "connect_wifi ssid=\"guest_network\" password=\"sharma#123\"", "action": "connect_wifi"}
247
+ {"text": "jaldi laptop ko wifi Vi_Home pe lagao pass zxcv9087", "target": "connect_wifi ssid=\"vi_home\" password=\"zxcv9087\"", "action": "connect_wifi"}
248
+ {"text": "bhai laptop ko wifi ACT_Fibernet_7 pe lagao pass N3tg3ar! yaar", "target": "connect_wifi ssid=\"act_fibernet_7\" password=\"n3tg3ar!\"", "action": "connect_wifi"}
249
+ {"text": "laptop ko wifi Redmi Note 12 pe lagao pass Welcome123 thanks", "target": "connect_wifi ssid=\"redmi note 12\" password=\"welcome123\"", "action": "connect_wifi"}
250
+ {"text": "jaldi laptop ko wifi Guest_Network pe lagao pass Password@1 na", "target": "connect_wifi ssid=\"guest_network\" password=\"password@1\"", "action": "connect_wifi"}
251
+ {"text": "laptop ko wifi JioFiber-Home pe lagao pass Welcome123 na", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"welcome123\"", "action": "connect_wifi"}
252
+ {"text": "hey assistant laptop ko wifi TP-Link_A1B2 pe lagao pass Off!ce2024 thanks", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"off!ce2024\"", "action": "connect_wifi"}
253
+ {"text": "laptop ko wifi Excitel-Pro 5G pe lagao pass Cafe#Free77", "target": "connect_wifi ssid=\"excitel-pro 5g\" password=\"cafe#free77\"", "action": "connect_wifi"}
254
+ {"text": "jaldi laptop ko wifi Redmi Note 12 pe lagao pass Wifi@2024 abhi", "target": "connect_wifi ssid=\"redmi note 12\" password=\"wifi@2024\"", "action": "connect_wifi"}
255
+ {"text": "hey assistant laptop ko wifi Redmi Note 12 pe lagao pass zxcv9087", "target": "connect_wifi ssid=\"redmi note 12\" password=\"zxcv9087\"", "action": "connect_wifi"}
256
+ {"text": "please laptop ko wifi Airtel_5G pe lagao pass Guest@123 jaldi", "target": "connect_wifi ssid=\"airtel_5g\" password=\"guest@123\"", "action": "connect_wifi"}
257
+ {"text": "hey assistant laptop ko wifi Studio Wifi pe lagao pass jio#12345", "target": "connect_wifi ssid=\"studio wifi\" password=\"jio#12345\"", "action": "connect_wifi"}
258
+ {"text": "laptop ko wifi Hostel Block B pe lagao pass lalit.home7 abhi", "target": "connect_wifi ssid=\"hostel block b\" password=\"lalit.home7\"", "action": "connect_wifi"}
259
+ {"text": "bhai laptop ko wifi MyNet pe lagao pass raVi_9988 thanks", "target": "connect_wifi ssid=\"mynet\" password=\"ravi_9988\"", "action": "connect_wifi"}
260
+ {"text": "bhai laptop ko wifi Room 204 pe lagao pass jio#12345 yaar", "target": "connect_wifi ssid=\"room 204\" password=\"jio#12345\"", "action": "connect_wifi"}
261
+ {"text": "hey assistant laptop ko wifi Vi_Home pe lagao pass Pass@word99 yaar", "target": "connect_wifi ssid=\"vi_home\" password=\"pass@word99\"", "action": "connect_wifi"}
262
+ {"text": "laptop ko wifi Studio Wifi pe lagao pass Str0ng-P@ss thanks", "target": "connect_wifi ssid=\"studio wifi\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
263
+ {"text": "zara laptop ko wifi Kumar_House_2 pe lagao pass raVi_9988 please", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"ravi_9988\"", "action": "connect_wifi"}
264
+ {"text": "please laptop ko wifi HomeNet pe lagao pass zxcv9087", "target": "connect_wifi ssid=\"homenet\" password=\"zxcv9087\"", "action": "connect_wifi"}
265
+ {"text": "laptop ko wifi D-Link_DIR615 pe lagao pass Off!ce2024 thanks", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"off!ce2024\"", "action": "connect_wifi"}
266
+ {"text": "laptop ko wifi OnePlus Nord pe lagao pass Mehta&Sons9 please", "target": "connect_wifi ssid=\"oneplus nord\" password=\"mehta&sons9\"", "action": "connect_wifi"}
267
+ {"text": "zara laptop ko wifi BSNL-FTTH-2291 pe lagao pass Guest@123 na", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"guest@123\"", "action": "connect_wifi"}
268
+ {"text": "laptop ko wifi Home 2.4G pe lagao pass abc12345", "target": "connect_wifi ssid=\"home 2.4g\" password=\"abc12345\"", "action": "connect_wifi"}
269
+ {"text": "laptop ko wifi Studio Wifi pe lagao pass Off!ce2024 thanks", "target": "connect_wifi ssid=\"studio wifi\" password=\"off!ce2024\"", "action": "connect_wifi"}
270
+ {"text": "laptop ko wifi D-Link_DIR615 pe lagao pass pi-lab-2026 jaldi", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
271
+ {"text": "please laptop ko wifi D-Link_DIR615 pe lagao pass qwerty!09 thanks", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"qwerty!09\"", "action": "connect_wifi"}
272
+ {"text": "bhai laptop ko wifi Vi_Home pe lagao pass Mehta&Sons9 yaar", "target": "connect_wifi ssid=\"vi_home\" password=\"mehta&sons9\"", "action": "connect_wifi"}
273
+ {"text": "zara laptop ko wifi HomeNet pe lagao pass 9876543210", "target": "connect_wifi ssid=\"homenet\" password=\"9876543210\"", "action": "connect_wifi"}
274
+ {"text": "hey assistant laptop ko wifi Mehta_Family pe lagao pass jio#12345 na", "target": "connect_wifi ssid=\"mehta_family\" password=\"jio#12345\"", "action": "connect_wifi"}
275
+ {"text": "laptop ko wifi TP-Link_A1B2 pe lagao pass Library2026", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"library2026\"", "action": "connect_wifi"}
276
+ {"text": "laptop ko wifi BSNL-FTTH-2291 pe lagao pass 9876543210 na", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"9876543210\"", "action": "connect_wifi"}
277
+ {"text": "zara laptop ko wifi Hostel Block B pe lagao pass Welcome123 jaldi", "target": "connect_wifi ssid=\"hostel block b\" password=\"welcome123\"", "action": "connect_wifi"}
278
+ {"text": "please laptop ko wifi Redmi Note 12 pe lagao pass Library2026", "target": "connect_wifi ssid=\"redmi note 12\" password=\"library2026\"", "action": "connect_wifi"}
279
+ {"text": "laptop ko wifi Room 204 pe lagao pass Wifi@2024", "target": "connect_wifi ssid=\"room 204\" password=\"wifi@2024\"", "action": "connect_wifi"}
280
+ {"text": "laptop ko wifi iPhone of Ravi pe lagao pass Guest@123 jaldi", "target": "connect_wifi ssid=\"iphone of ravi\" password=\"guest@123\"", "action": "connect_wifi"}
281
+ {"text": "laptop ko wifi TP-Link_A1B2 pe lagao pass Wifi@2024 yaar", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"wifi@2024\"", "action": "connect_wifi"}
282
+ {"text": "zara laptop ko wifi BSNL-FTTH-2291 pe lagao pass Pass@word99 na", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"pass@word99\"", "action": "connect_wifi"}
283
+ {"text": "zara laptop ko wifi PiLab pe lagao pass Str0ng-P@ss thanks", "target": "connect_wifi ssid=\"pilab\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
284
+ {"text": "bhai laptop ko wifi TP-Link_A1B2 pe lagao pass jio#12345 thanks", "target": "connect_wifi ssid=\"tp-link_a1b2\" password=\"jio#12345\"", "action": "connect_wifi"}
285
+ {"text": "please laptop ko wifi Kumar_House_2 pe lagao pass 9876543210", "target": "connect_wifi ssid=\"kumar_house_2\" password=\"9876543210\"", "action": "connect_wifi"}
286
+ {"text": "zara laptop ko wifi Airtel_5G pe lagao pass zxcv9087 jaldi", "target": "connect_wifi ssid=\"airtel_5g\" password=\"zxcv9087\"", "action": "connect_wifi"}
287
+ {"text": "hey assistant laptop ko wifi Vi_Home pe lagao pass Pass@word99 na", "target": "connect_wifi ssid=\"vi_home\" password=\"pass@word99\"", "action": "connect_wifi"}
288
+ {"text": "please laptop ko wifi D-Link_DIR615 pe lagao pass Password@1", "target": "connect_wifi ssid=\"d-link_dir615\" password=\"password@1\"", "action": "connect_wifi"}
289
+ {"text": "bhai laptop ko wifi NETGEAR42 pe lagao pass jio#12345 abhi", "target": "connect_wifi ssid=\"netgear42\" password=\"jio#12345\"", "action": "connect_wifi"}
290
+ {"text": "bhai laptop ko wifi HomeNet pe lagao pass Str0ng-P@ss abhi", "target": "connect_wifi ssid=\"homenet\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
291
+ {"text": "zara laptop ko wifi Home 2.4G pe lagao pass Mehta&Sons9", "target": "connect_wifi ssid=\"home 2.4g\" password=\"mehta&sons9\"", "action": "connect_wifi"}
292
+ {"text": "jaldi laptop ko wifi Home 2.4G pe lagao pass pi-lab-2026 jaldi", "target": "connect_wifi ssid=\"home 2.4g\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
293
+ {"text": "laptop ko wifi BSNL-FTTH-2291 pe lagao pass Str0ng-P@ss abhi", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"str0ng-p@ss\"", "action": "connect_wifi"}
294
+ {"text": "hey assistant laptop ko wifi OnePlus Nord pe lagao pass Welcome123 na", "target": "connect_wifi ssid=\"oneplus nord\" password=\"welcome123\"", "action": "connect_wifi"}
295
+ {"text": "jaldi laptop ko wifi Tenda_8C21F0 pe lagao pass Wifi@2024 yaar", "target": "connect_wifi ssid=\"tenda_8c21f0\" password=\"wifi@2024\"", "action": "connect_wifi"}
296
+ {"text": "bhai laptop ko wifi Excitel-Pro 5G pe lagao pass pi-lab-2026 na", "target": "connect_wifi ssid=\"excitel-pro 5g\" password=\"pi-lab-2026\"", "action": "connect_wifi"}
297
+ {"text": "zara laptop ko wifi Home 2.4G pe lagao pass Cafe#Free77 yaar", "target": "connect_wifi ssid=\"home 2.4g\" password=\"cafe#free77\"", "action": "connect_wifi"}
298
+ {"text": "ok laptop ko wifi Home 2.4G pe lagao pass lalit.home7 yaar", "target": "connect_wifi ssid=\"home 2.4g\" password=\"lalit.home7\"", "action": "connect_wifi"}
299
+ {"text": "zara laptop ko wifi JioFiber-Home pe lagao pass 9876543210 na", "target": "connect_wifi ssid=\"jiofiber-home\" password=\"9876543210\"", "action": "connect_wifi"}
300
+ {"text": "bhai laptop ko wifi BSNL-FTTH-2291 pe lagao pass Kumar@1987", "target": "connect_wifi ssid=\"bsnl-ftth-2291\" password=\"kumar@1987\"", "action": "connect_wifi"}
301
+ {"text": "connect to the OnePlus Nord wifi", "target": "connect_wifi ssid=\"oneplus nord\"", "action": "connect_wifi"}
302
+ {"text": "ok connect to the Home 2.4G wifi yaar", "target": "connect_wifi ssid=\"home 2.4g\"", "action": "connect_wifi"}
303
+ {"text": "hey assistant connect to the Redmi Note 12 wifi jaldi", "target": "connect_wifi ssid=\"redmi note 12\"", "action": "connect_wifi"}
304
+ {"text": "connect to the JioFiber-Home wifi abhi", "target": "connect_wifi ssid=\"jiofiber-home\"", "action": "connect_wifi"}
305
+ {"text": "hey assistant connect to the OnePlus Nord wifi please", "target": "connect_wifi ssid=\"oneplus nord\"", "action": "connect_wifi"}
306
+ {"text": "jaldi connect to the Excitel-Pro 5G wifi yaar", "target": "connect_wifi ssid=\"excitel-pro 5g\"", "action": "connect_wifi"}
307
+ {"text": "bhai connect to the Redmi Note 12 wifi please", "target": "connect_wifi ssid=\"redmi note 12\"", "action": "connect_wifi"}
308
+ {"text": "connect to the Hathway_3F9C wifi thanks", "target": "connect_wifi ssid=\"hathway_3f9c\"", "action": "connect_wifi"}
309
+ {"text": "hey assistant connect to the Redmi Note 12 wifi", "target": "connect_wifi ssid=\"redmi note 12\"", "action": "connect_wifi"}
310
+ {"text": "ok connect to the Cafe Coffee Day wifi", "target": "connect_wifi ssid=\"cafe coffee day\"", "action": "connect_wifi"}
311
+ {"text": "connect to the Cafe Coffee Day wifi abhi", "target": "connect_wifi ssid=\"cafe coffee day\"", "action": "connect_wifi"}
312
+ {"text": "please connect to the Cafe Coffee Day wifi", "target": "connect_wifi ssid=\"cafe coffee day\"", "action": "connect_wifi"}
313
+ {"text": "connect to the TP-Link_A1B2 wifi please", "target": "connect_wifi ssid=\"tp-link_a1b2\"", "action": "connect_wifi"}
314
+ {"text": "please connect to the Galaxy M31 wifi", "target": "connect_wifi ssid=\"galaxy m31\"", "action": "connect_wifi"}
315
+ {"text": "hey assistant connect to the Vi_Home wifi yaar", "target": "connect_wifi ssid=\"vi_home\"", "action": "connect_wifi"}
316
+ {"text": "bhai connect to the Room 204 wifi abhi", "target": "connect_wifi ssid=\"room 204\"", "action": "connect_wifi"}
317
+ {"text": "zara connect to the Room 204 wifi please", "target": "connect_wifi ssid=\"room 204\"", "action": "connect_wifi"}
318
+ {"text": "zara connect to the Redmi Note 12 wifi please", "target": "connect_wifi ssid=\"redmi note 12\"", "action": "connect_wifi"}
319
+ {"text": "connect to the Kumar_House_2 wifi thanks", "target": "connect_wifi ssid=\"kumar_house_2\"", "action": "connect_wifi"}
320
+ {"text": "ok connect to the Hathway_3F9C wifi jaldi", "target": "connect_wifi ssid=\"hathway_3f9c\"", "action": "connect_wifi"}
321
+ {"text": "connect to the TP-Link_A1B2 wifi na", "target": "connect_wifi ssid=\"tp-link_a1b2\"", "action": "connect_wifi"}
322
+ {"text": "connect to the Galaxy M31 wifi thanks", "target": "connect_wifi ssid=\"galaxy m31\"", "action": "connect_wifi"}
323
+ {"text": "connect to the MyNet wifi", "target": "connect_wifi ssid=\"mynet\"", "action": "connect_wifi"}
324
+ {"text": "ok connect to the iPhone of Ravi wifi", "target": "connect_wifi ssid=\"iphone of ravi\"", "action": "connect_wifi"}
325
+ {"text": "bhai connect to the HomeNet wifi", "target": "connect_wifi ssid=\"homenet\"", "action": "connect_wifi"}
326
+ {"text": "ok connect to the Sharma Ji Home wifi jaldi", "target": "connect_wifi ssid=\"sharma ji home\"", "action": "connect_wifi"}
327
+ {"text": "connect to the Tenda_8C21F0 wifi abhi", "target": "connect_wifi ssid=\"tenda_8c21f0\"", "action": "connect_wifi"}
328
+ {"text": "zara connect to the Galaxy M31 wifi", "target": "connect_wifi ssid=\"galaxy m31\"", "action": "connect_wifi"}
329
+ {"text": "connect to the ACT_Fibernet_7 wifi jaldi", "target": "connect_wifi ssid=\"act_fibernet_7\"", "action": "connect_wifi"}
330
+ {"text": "connect to the Kumar_House_2 wifi abhi", "target": "connect_wifi ssid=\"kumar_house_2\"", "action": "connect_wifi"}
331
+ {"text": "ok connect to the D-Link_DIR615 wifi", "target": "connect_wifi ssid=\"d-link_dir615\"", "action": "connect_wifi"}
332
+ {"text": "please connect to the iPhone of Ravi wifi", "target": "connect_wifi ssid=\"iphone of ravi\"", "action": "connect_wifi"}
333
+ {"text": "bhai connect to the iPhone of Ravi wifi abhi", "target": "connect_wifi ssid=\"iphone of ravi\"", "action": "connect_wifi"}
334
+ {"text": "hey assistant connect to the Vi_Home wifi please", "target": "connect_wifi ssid=\"vi_home\"", "action": "connect_wifi"}
335
+ {"text": "zara connect to the OnePlus Nord wifi", "target": "connect_wifi ssid=\"oneplus nord\"", "action": "connect_wifi"}
336
+ {"text": "jaldi connect to the Mehta_Family wifi", "target": "connect_wifi ssid=\"mehta_family\"", "action": "connect_wifi"}
337
+ {"text": "hey assistant connect to the Tenda_8C21F0 wifi", "target": "connect_wifi ssid=\"tenda_8c21f0\"", "action": "connect_wifi"}
338
+ {"text": "hey assistant connect to the Room 204 wifi please", "target": "connect_wifi ssid=\"room 204\"", "action": "connect_wifi"}
339
+ {"text": "bhai connect to the Galaxy M31 wifi", "target": "connect_wifi ssid=\"galaxy m31\"", "action": "connect_wifi"}
340
+ {"text": "wifi Classroom WiFi bhool jao", "target": "forget_wifi ssid=\"classroom wifi\"", "action": "forget_wifi"}
341
+ {"text": "wifi NETGEAR42 bhool jao na", "target": "forget_wifi ssid=\"netgear42\"", "action": "forget_wifi"}
342
+ {"text": "jaldi wifi TP-Link_A1B2 bhool jao please", "target": "forget_wifi ssid=\"tp-link_a1b2\"", "action": "forget_wifi"}
343
+ {"text": "hey assistant wifi Studio Wifi bhool jao please", "target": "forget_wifi ssid=\"studio wifi\"", "action": "forget_wifi"}
344
+ {"text": "hey assistant wifi Office WiFi 5G bhool jao na", "target": "forget_wifi ssid=\"office wifi 5g\"", "action": "forget_wifi"}
345
+ {"text": "zara wifi Vi_Home bhool jao", "target": "forget_wifi ssid=\"vi_home\"", "action": "forget_wifi"}
346
+ {"text": "bhai wifi TP-Link_A1B2 bhool jao", "target": "forget_wifi ssid=\"tp-link_a1b2\"", "action": "forget_wifi"}
347
+ {"text": "hey assistant wifi Home 2.4G bhool jao thanks", "target": "forget_wifi ssid=\"home 2.4g\"", "action": "forget_wifi"}
348
+ {"text": "bhai wifi Hathway_3F9C bhool jao please", "target": "forget_wifi ssid=\"hathway_3f9c\"", "action": "forget_wifi"}
349
+ {"text": "wifi Vi_Home bhool jao thanks", "target": "forget_wifi ssid=\"vi_home\"", "action": "forget_wifi"}
350
+ {"text": "please wifi Excitel-Pro 5G bhool jao", "target": "forget_wifi ssid=\"excitel-pro 5g\"", "action": "forget_wifi"}
351
+ {"text": "ok wifi Room 204 bhool jao yaar", "target": "forget_wifi ssid=\"room 204\"", "action": "forget_wifi"}
352
+ {"text": "wifi Studio Wifi bhool jao abhi", "target": "forget_wifi ssid=\"studio wifi\"", "action": "forget_wifi"}
353
+ {"text": "jaldi wifi Hostel Block B bhool jao", "target": "forget_wifi ssid=\"hostel block b\"", "action": "forget_wifi"}
354
+ {"text": "hey assistant wifi Tenda_8C21F0 bhool jao jaldi", "target": "forget_wifi ssid=\"tenda_8c21f0\"", "action": "forget_wifi"}
355
+ {"text": "wifi Library-Guest bhool jao abhi", "target": "forget_wifi ssid=\"library-guest\"", "action": "forget_wifi"}
356
+ {"text": "wifi Airtel_5G bhool jao", "target": "forget_wifi ssid=\"airtel_5g\"", "action": "forget_wifi"}
357
+ {"text": "hey assistant wifi Office WiFi 5G bhool jao", "target": "forget_wifi ssid=\"office wifi 5g\"", "action": "forget_wifi"}
358
+ {"text": "ok wifi Kumar_House_2 bhool jao", "target": "forget_wifi ssid=\"kumar_house_2\"", "action": "forget_wifi"}
359
+ {"text": "jaldi wifi Redmi Note 12 bhool jao na", "target": "forget_wifi ssid=\"redmi note 12\"", "action": "forget_wifi"}
360
+ {"text": "ok wifi Redmi Note 12 bhool jao please", "target": "forget_wifi ssid=\"redmi note 12\"", "action": "forget_wifi"}
361
+ {"text": "wifi Studio Wifi bhool jao thanks", "target": "forget_wifi ssid=\"studio wifi\"", "action": "forget_wifi"}
362
+ {"text": "zara wifi D-Link_DIR615 bhool jao jaldi", "target": "forget_wifi ssid=\"d-link_dir615\"", "action": "forget_wifi"}
363
+ {"text": "hey assistant wifi Airtel_5G bhool jao jaldi", "target": "forget_wifi ssid=\"airtel_5g\"", "action": "forget_wifi"}
364
+ {"text": "ok wifi TP-Link_A1B2 bhool jao please", "target": "forget_wifi ssid=\"tp-link_a1b2\"", "action": "forget_wifi"}
365
+ {"text": "wifi JioFiber-Home bhool jao", "target": "forget_wifi ssid=\"jiofiber-home\"", "action": "forget_wifi"}
366
+ {"text": "hey assistant wifi Office WiFi 5G bhool jao yaar", "target": "forget_wifi ssid=\"office wifi 5g\"", "action": "forget_wifi"}
367
+ {"text": "wifi PiLab bhool jao", "target": "forget_wifi ssid=\"pilab\"", "action": "forget_wifi"}
368
+ {"text": "please wifi Home 2.4G bhool jao yaar", "target": "forget_wifi ssid=\"home 2.4g\"", "action": "forget_wifi"}
369
+ {"text": "ok wifi OnePlus Nord bhool jao", "target": "forget_wifi ssid=\"oneplus nord\"", "action": "forget_wifi"}
370
+ {"text": "hey assistant wifi NETGEAR42 bhool jao yaar", "target": "forget_wifi ssid=\"netgear42\"", "action": "forget_wifi"}
371
+ {"text": "hey assistant wifi JioFiber-Home bhool jao yaar", "target": "forget_wifi ssid=\"jiofiber-home\"", "action": "forget_wifi"}
372
+ {"text": "zara wifi PiLab bhool jao", "target": "forget_wifi ssid=\"pilab\"", "action": "forget_wifi"}
373
+ {"text": "bhai wifi Studio Wifi bhool jao", "target": "forget_wifi ssid=\"studio wifi\"", "action": "forget_wifi"}
374
+ {"text": "wifi BSNL-FTTH-2291 bhool jao please", "target": "forget_wifi ssid=\"bsnl-ftth-2291\"", "action": "forget_wifi"}
375
+ {"text": "please wifi Office WiFi 5G bhool jao jaldi", "target": "forget_wifi ssid=\"office wifi 5g\"", "action": "forget_wifi"}
376
+ {"text": "bhai wifi iPhone of Ravi bhool jao yaar", "target": "forget_wifi ssid=\"iphone of ravi\"", "action": "forget_wifi"}
377
+ {"text": "bhai wifi iPhone of Ravi bhool jao jaldi", "target": "forget_wifi ssid=\"iphone of ravi\"", "action": "forget_wifi"}
378
+ {"text": "wifi Sharma Ji Home bhool jao jaldi", "target": "forget_wifi ssid=\"sharma ji home\"", "action": "forget_wifi"}
379
+ {"text": "wifi Mehta_Family bhool jao please", "target": "forget_wifi ssid=\"mehta_family\"", "action": "forget_wifi"}
380
+ {"text": "bhai wifi Hostel Block B bhool jao", "target": "forget_wifi ssid=\"hostel block b\"", "action": "forget_wifi"}
381
+ {"text": "wifi Sharma Ji Home bhool jao please", "target": "forget_wifi ssid=\"sharma ji home\"", "action": "forget_wifi"}
382
+ {"text": "please wifi ACT_Fibernet_7 bhool jao", "target": "forget_wifi ssid=\"act_fibernet_7\"", "action": "forget_wifi"}
383
+ {"text": "ok D-Link_DIR615 ka profile delete kar do", "target": "forget_wifi ssid=\"d-link_dir615\"", "action": "forget_wifi"}
384
+ {"text": "jaldi Sharma Ji Home ka profile delete kar do abhi", "target": "forget_wifi ssid=\"sharma ji home\"", "action": "forget_wifi"}
385
+ {"text": "please BSNL-FTTH-2291 ka profile delete kar do", "target": "forget_wifi ssid=\"bsnl-ftth-2291\"", "action": "forget_wifi"}
386
+ {"text": "bhai Mehta_Family ka profile delete kar do", "target": "forget_wifi ssid=\"mehta_family\"", "action": "forget_wifi"}
387
+ {"text": "zara Airtel_5G ka profile delete kar do abhi", "target": "forget_wifi ssid=\"airtel_5g\"", "action": "forget_wifi"}
388
+ {"text": "TP-Link_A1B2 ka profile delete kar do abhi", "target": "forget_wifi ssid=\"tp-link_a1b2\"", "action": "forget_wifi"}
389
+ {"text": "HomeNet ka profile delete kar do na", "target": "forget_wifi ssid=\"homenet\"", "action": "forget_wifi"}
390
+ {"text": "hey assistant Airtel_5G ka profile delete kar do abhi", "target": "forget_wifi ssid=\"airtel_5g\"", "action": "forget_wifi"}
391
+ {"text": "ok Sharma Ji Home ka profile delete kar do thanks", "target": "forget_wifi ssid=\"sharma ji home\"", "action": "forget_wifi"}
392
+ {"text": "zara PiLab ka profile delete kar do please", "target": "forget_wifi ssid=\"pilab\"", "action": "forget_wifi"}
393
+ {"text": "Room 204 ka profile delete kar do abhi", "target": "forget_wifi ssid=\"room 204\"", "action": "forget_wifi"}
394
+ {"text": "Classroom WiFi ka profile delete kar do please", "target": "forget_wifi ssid=\"classroom wifi\"", "action": "forget_wifi"}
395
+ {"text": "Vi_Home ka profile delete kar do thanks", "target": "forget_wifi ssid=\"vi_home\"", "action": "forget_wifi"}
396
+ {"text": "Sharma Ji Home ka profile delete kar do na", "target": "forget_wifi ssid=\"sharma ji home\"", "action": "forget_wifi"}
397
+ {"text": "D-Link_DIR615 ka profile delete kar do yaar", "target": "forget_wifi ssid=\"d-link_dir615\"", "action": "forget_wifi"}
398
+ {"text": "Mehta_Family ka profile delete kar do thanks", "target": "forget_wifi ssid=\"mehta_family\"", "action": "forget_wifi"}
399
+ {"text": "PiLab ka profile delete kar do", "target": "forget_wifi ssid=\"pilab\"", "action": "forget_wifi"}
400
+ {"text": "ok Airtel_5G ka profile delete kar do thanks", "target": "forget_wifi ssid=\"airtel_5g\"", "action": "forget_wifi"}
401
+ {"text": "hey assistant Mehta_Family ka profile delete kar do na", "target": "forget_wifi ssid=\"mehta_family\"", "action": "forget_wifi"}
402
+ {"text": "zara D-Link_DIR615 ka profile delete kar do", "target": "forget_wifi ssid=\"d-link_dir615\"", "action": "forget_wifi"}
403
+ {"text": "BSNL-FTTH-2291 ka profile delete kar do jaldi", "target": "forget_wifi ssid=\"bsnl-ftth-2291\"", "action": "forget_wifi"}
404
+ {"text": "hey assistant Tenda_8C21F0 ka profile delete kar do jaldi", "target": "forget_wifi ssid=\"tenda_8c21f0\"", "action": "forget_wifi"}
405
+ {"text": "NETGEAR42 ka profile delete kar do thanks", "target": "forget_wifi ssid=\"netgear42\"", "action": "forget_wifi"}
406
+ {"text": "Studio Wifi ka profile delete kar do", "target": "forget_wifi ssid=\"studio wifi\"", "action": "forget_wifi"}
407
+ {"text": "zara ACT_Fibernet_7 ka profile delete kar do abhi", "target": "forget_wifi ssid=\"act_fibernet_7\"", "action": "forget_wifi"}
408
+ {"text": "hey assistant Sharma Ji Home ka profile delete kar do please", "target": "forget_wifi ssid=\"sharma ji home\"", "action": "forget_wifi"}
409
+ {"text": "zara Guest_Network ka profile delete kar do", "target": "forget_wifi ssid=\"guest_network\"", "action": "forget_wifi"}
410
+ {"text": "ok Galaxy M31 ka profile delete kar do abhi", "target": "forget_wifi ssid=\"galaxy m31\"", "action": "forget_wifi"}
411
+ {"text": "iPhone of Ravi ka profile delete kar do", "target": "forget_wifi ssid=\"iphone of ravi\"", "action": "forget_wifi"}
412
+ {"text": "Mehta_Family ka profile delete kar do jaldi", "target": "forget_wifi ssid=\"mehta_family\"", "action": "forget_wifi"}
413
+ {"text": "Hathway_3F9C ka profile delete kar do abhi", "target": "forget_wifi ssid=\"hathway_3f9c\"", "action": "forget_wifi"}
414
+ {"text": "Home 2.4G ka profile delete kar do", "target": "forget_wifi ssid=\"home 2.4g\"", "action": "forget_wifi"}
415
+ {"text": "hey assistant MyNet ka profile delete kar do jaldi", "target": "forget_wifi ssid=\"mynet\"", "action": "forget_wifi"}
416
+ {"text": "please Office WiFi 5G ka profile delete kar do please", "target": "forget_wifi ssid=\"office wifi 5g\"", "action": "forget_wifi"}
417
+ {"text": "bhai Redmi Note 12 ka profile delete kar do thanks", "target": "forget_wifi ssid=\"redmi note 12\"", "action": "forget_wifi"}
418
+ {"text": "please Library-Guest ka profile delete kar do", "target": "forget_wifi ssid=\"library-guest\"", "action": "forget_wifi"}
419
+ {"text": "please D-Link_DIR615 ka profile delete kar do abhi", "target": "forget_wifi ssid=\"d-link_dir615\"", "action": "forget_wifi"}
420
+ {"text": "hey assistant TP-Link_A1B2 ka profile delete kar do na", "target": "forget_wifi ssid=\"tp-link_a1b2\"", "action": "forget_wifi"}
421
+ {"text": "hey assistant HomeNet ka profile delete kar do na", "target": "forget_wifi ssid=\"homenet\"", "action": "forget_wifi"}
422
+ {"text": "HomeNet ka profile delete kar do", "target": "forget_wifi ssid=\"homenet\"", "action": "forget_wifi"}
423
+ {"text": "please Mehta_Family ka profile delete kar do jaldi", "target": "forget_wifi ssid=\"mehta_family\"", "action": "forget_wifi"}
424
+ {"text": "jaldi Hostel Block B ka profile delete kar do yaar", "target": "forget_wifi ssid=\"hostel block b\"", "action": "forget_wifi"}
425
+ {"text": "please Vi_Home ka profile delete kar do abhi", "target": "forget_wifi ssid=\"vi_home\"", "action": "forget_wifi"}
426
+ {"text": "hey assistant Room 204 ka profile delete kar do na", "target": "forget_wifi ssid=\"room 204\"", "action": "forget_wifi"}
427
+ {"text": "ok ACT_Fibernet_7 ka password kya hai abhi", "target": "show_wifi_password ssid=\"act_fibernet_7\"", "action": "show_wifi_password"}
428
+ {"text": "zara Hathway_3F9C ka password kya hai", "target": "show_wifi_password ssid=\"hathway_3f9c\"", "action": "show_wifi_password"}
429
+ {"text": "jaldi Guest_Network ka password kya hai na", "target": "show_wifi_password ssid=\"guest_network\"", "action": "show_wifi_password"}
430
+ {"text": "ok NETGEAR42 ka password kya hai abhi", "target": "show_wifi_password ssid=\"netgear42\"", "action": "show_wifi_password"}
431
+ {"text": "ok Mehta_Family ka password kya hai jaldi", "target": "show_wifi_password ssid=\"mehta_family\"", "action": "show_wifi_password"}
432
+ {"text": "bhai Redmi Note 12 ka password kya hai abhi", "target": "show_wifi_password ssid=\"redmi note 12\"", "action": "show_wifi_password"}
433
+ {"text": "Cafe Coffee Day ka password kya hai abhi", "target": "show_wifi_password ssid=\"cafe coffee day\"", "action": "show_wifi_password"}
434
+ {"text": "jaldi Redmi Note 12 ka password kya hai jaldi", "target": "show_wifi_password ssid=\"redmi note 12\"", "action": "show_wifi_password"}
435
+ {"text": "Cafe Coffee Day ka password kya hai", "target": "show_wifi_password ssid=\"cafe coffee day\"", "action": "show_wifi_password"}
436
+ {"text": "ok Airtel_5G ka password kya hai na", "target": "show_wifi_password ssid=\"airtel_5g\"", "action": "show_wifi_password"}
437
+ {"text": "ok JioFiber-Home ka password kya hai jaldi", "target": "show_wifi_password ssid=\"jiofiber-home\"", "action": "show_wifi_password"}
438
+ {"text": "Library-Guest ka password kya hai", "target": "show_wifi_password ssid=\"library-guest\"", "action": "show_wifi_password"}
439
+ {"text": "MyNet ka password kya hai thanks", "target": "show_wifi_password ssid=\"mynet\"", "action": "show_wifi_password"}
440
+ {"text": "Home 2.4G ka password kya hai abhi", "target": "show_wifi_password ssid=\"home 2.4g\"", "action": "show_wifi_password"}
441
+ {"text": "ok Studio Wifi ka password kya hai", "target": "show_wifi_password ssid=\"studio wifi\"", "action": "show_wifi_password"}
442
+ {"text": "jaldi Kumar_House_2 ka password kya hai thanks", "target": "show_wifi_password ssid=\"kumar_house_2\"", "action": "show_wifi_password"}
443
+ {"text": "hey assistant Kumar_House_2 ka password kya hai", "target": "show_wifi_password ssid=\"kumar_house_2\"", "action": "show_wifi_password"}
444
+ {"text": "ok Redmi Note 12 ka password kya hai abhi", "target": "show_wifi_password ssid=\"redmi note 12\"", "action": "show_wifi_password"}
445
+ {"text": "zara Room 204 ka password kya hai jaldi", "target": "show_wifi_password ssid=\"room 204\"", "action": "show_wifi_password"}
446
+ {"text": "bhai Office WiFi 5G ka password kya hai jaldi", "target": "show_wifi_password ssid=\"office wifi 5g\"", "action": "show_wifi_password"}
447
+ {"text": "OnePlus Nord ka password kya hai", "target": "show_wifi_password ssid=\"oneplus nord\"", "action": "show_wifi_password"}
448
+ {"text": "Airtel_5G ka password kya hai thanks", "target": "show_wifi_password ssid=\"airtel_5g\"", "action": "show_wifi_password"}
449
+ {"text": "hey assistant MyNet ka password kya hai thanks", "target": "show_wifi_password ssid=\"mynet\"", "action": "show_wifi_password"}
450
+ {"text": "jaldi OnePlus Nord ka password kya hai", "target": "show_wifi_password ssid=\"oneplus nord\"", "action": "show_wifi_password"}
451
+ {"text": "bhai Home 2.4G ka password kya hai", "target": "show_wifi_password ssid=\"home 2.4g\"", "action": "show_wifi_password"}
452
+ {"text": "please Cafe Coffee Day ka password kya hai", "target": "show_wifi_password ssid=\"cafe coffee day\"", "action": "show_wifi_password"}
453
+ {"text": "jaldi D-Link_DIR615 ka password kya hai abhi", "target": "show_wifi_password ssid=\"d-link_dir615\"", "action": "show_wifi_password"}
454
+ {"text": "Studio Wifi ka password kya hai abhi", "target": "show_wifi_password ssid=\"studio wifi\"", "action": "show_wifi_password"}
455
+ {"text": "Guest_Network ka password kya hai", "target": "show_wifi_password ssid=\"guest_network\"", "action": "show_wifi_password"}
456
+ {"text": "D-Link_DIR615 ka password kya hai", "target": "show_wifi_password ssid=\"d-link_dir615\"", "action": "show_wifi_password"}
457
+ {"text": "Redmi Note 12 ka password kya hai abhi", "target": "show_wifi_password ssid=\"redmi note 12\"", "action": "show_wifi_password"}
458
+ {"text": "bhai Classroom WiFi ka password kya hai abhi", "target": "show_wifi_password ssid=\"classroom wifi\"", "action": "show_wifi_password"}
459
+ {"text": "please BSNL-FTTH-2291 ka password kya hai thanks", "target": "show_wifi_password ssid=\"bsnl-ftth-2291\"", "action": "show_wifi_password"}
460
+ {"text": "Home 2.4G ka password kya hai", "target": "show_wifi_password ssid=\"home 2.4g\"", "action": "show_wifi_password"}
461
+ {"text": "zara NETGEAR42 ka password kya hai abhi", "target": "show_wifi_password ssid=\"netgear42\"", "action": "show_wifi_password"}
executor/commands.py ADDED
@@ -0,0 +1,346 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Command templates for every union action. CMD[action] = {"win": "<kind>:<template>", "pi": "<kind>:<template>"}
2
+ kind: ps (PowerShell) | cmd (cmd.exe) | sh (bash) | key (key combo) | open (URL/file via default handler) | py (executor builtin)
3
+ None = not available on that platform.
4
+ Placeholders are slot names ({pin}, {path}, {query} ...) plus derived ones the executor fills in:
5
+ {seconds} {minutes} (from amount+unit) {step} (default 10) {sudo} ('sudo ' when needed_sudo) {home}
6
+ {app_win} {app_pi} {site_url} {folder_win} {folder_pi} {page_uri} {svc_unit} {svc_win} {mode_cmd} {gpio} (bcm number after board->bcm)
7
+ Values are shell-quoted by the executor before substitution; templates must not add their own quotes around {…}.
8
+ """
9
+ from tables import WIN_AUDIO as _A, WIN_KEYS as _K, WIN_BT as _B, WIN_SCREENSHOT as _S
10
+ def _esc(x): return x.replace('{', '{{').replace('}', '}}') # embedded PowerShell/C# braces must survive str.format
11
+ WIN_AUDIO, WIN_KEYS, WIN_BT, WIN_SCREENSHOT = _esc(_A), _esc(_K), _esc(_B), _esc(_S)
12
+
13
+ def K(win, pi): return {"win": win, "pi": pi}
14
+ PS_BRIGHT = "$m=Get-CimInstance -Namespace root/WMI -ClassName WmiMonitorBrightnessMethods; if(-not $m){{throw 'No controllable backlight'}}; "
15
+ PI_BRIGHT = "B=$(ls /sys/class/backlight | head -1); M=$(cat /sys/class/backlight/$B/max_brightness); "
16
+ CMD = {}
17
+ # ------------------------------------------------------------------ audio
18
+ CMD["set_volume"] = K("ps:" + WIN_AUDIO + "[Audio]::Mute=$false; [Audio]::Volume={value}/100", "sh:wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ {value}% || amixer -q sset Master {value}%")
19
+ CMD["volume_up"] = K("ps:" + WIN_AUDIO + "$v=[Audio]::Volume+{step}/100; [Audio]::Volume=[Math]::Min(1,$v); [int]([Audio]::Volume*100)", "sh:wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ {step}%+")
20
+ CMD["volume_down"] = K("ps:" + WIN_AUDIO + "$v=[Audio]::Volume-{step}/100; [Audio]::Volume=[Math]::Max(0,$v); [int]([Audio]::Volume*100)", "sh:wpctl set-volume @DEFAULT_AUDIO_SINK@ {step}%-")
21
+ CMD["mute"] = K("ps:" + WIN_AUDIO + "[Audio]::Mute=$true", "sh:wpctl set-mute @DEFAULT_AUDIO_SINK@ 1")
22
+ CMD["unmute"] = K("ps:" + WIN_AUDIO + "[Audio]::Mute=$false", "sh:wpctl set-mute @DEFAULT_AUDIO_SINK@ 0")
23
+ CMD["get_volume"] = K("ps:" + WIN_AUDIO + "[int]([Audio]::Volume*100)", "sh:wpctl get-volume @DEFAULT_AUDIO_SINK@")
24
+ CMD["mic_mute"] = K("ps:" + WIN_AUDIO.replace("GetDefaultAudioEndpoint(0, 1", "GetDefaultAudioEndpoint(1, 1") + "[Audio]::Mute=$true", "sh:wpctl set-mute @DEFAULT_AUDIO_SOURCE@ 1")
25
+ CMD["mic_unmute"] = K("ps:" + WIN_AUDIO.replace("GetDefaultAudioEndpoint(0, 1", "GetDefaultAudioEndpoint(1, 1") + "[Audio]::Mute=$false", "sh:wpctl set-mute @DEFAULT_AUDIO_SOURCE@ 0")
26
+ CMD["set_audio_output"] = K("ps:Get-PnpDevice -Class AudioEndpoint | Where-Object FriendlyName -match {output} | Select-Object -First 1 FriendlyName; Write-Output 'select this device in Settings > Sound (no CLI default-switch API)'", "sh:wpctl status | grep -iA3 sinks; ID=$(wpctl status | grep -i {output} | grep -o '[0-9]*\\.' | head -1 | tr -d .); [ -n \"$ID\" ] && wpctl set-default $ID")
27
+ CMD["list_audio_devices"] = K("ps:Get-PnpDevice -Class AudioEndpoint,MEDIA | Where-Object Status -eq OK | Select-Object FriendlyName,Class", "sh:aplay -l; arecord -l; wpctl status")
28
+ CMD["record_audio"] = K("ps:Write-Output 'use: ffmpeg -f dshow -i audio=<mic> -t {seconds} rec.wav'; ffmpeg -f dshow -i audio=default -t {seconds} $env:USERPROFILE\\rec.wav", "sh:arecord -f S16_LE -r 16000 -c1 -d {seconds} ~/rec_$(date +%s).wav && echo saved")
29
+ # ------------------------------------------------------------------ display
30
+ CMD["set_brightness"] = K("ps:" + PS_BRIGHT + "$m | Invoke-CimMethod -MethodName WmiSetBrightness -Arguments @{{Timeout=1;Brightness=[byte]{value}}}", "sh:brightnessctl set {value}% 2>/dev/null || (" + PI_BRIGHT + "echo $(( {value} * M / 100 )) | sudo tee /sys/class/backlight/$B/brightness)")
31
+ CMD["brightness_up"] = K("ps:$c=(Get-CimInstance -Namespace root/WMI -ClassName WmiMonitorBrightness).CurrentBrightness; $n=[Math]::Min(100,$c+{step}); " + PS_BRIGHT + "$m | Invoke-CimMethod -MethodName WmiSetBrightness -Arguments @{{Timeout=1;Brightness=[byte]$n}}; $n", "sh:brightnessctl set +{step}%")
32
+ CMD["brightness_down"] = K("ps:$c=(Get-CimInstance -Namespace root/WMI -ClassName WmiMonitorBrightness).CurrentBrightness; $n=[Math]::Max(0,$c-{step}); " + PS_BRIGHT + "$m | Invoke-CimMethod -MethodName WmiSetBrightness -Arguments @{{Timeout=1;Brightness=[byte]$n}}; $n", "sh:brightnessctl set {step}%-")
33
+ CMD["get_brightness"] = K("ps:(Get-CimInstance -Namespace root/WMI -ClassName WmiMonitorBrightness).CurrentBrightness", "sh:brightnessctl get 2>/dev/null || cat /sys/class/backlight/*/brightness")
34
+ CMD["night_light_on"] = K("cmd:start ms-settings:nightlight", "sh:command -v wlsunset >/dev/null && (wlsunset -t 4000 -T 4001 &) || echo 'install wlsunset / redshift'")
35
+ CMD["night_light_off"] = K("cmd:start ms-settings:nightlight", "sh:pkill wlsunset; pkill redshift; echo 'night light off'")
36
+ CMD["dark_mode_on"] = K("ps:Set-ItemProperty HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize AppsUseLightTheme 0; Set-ItemProperty HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize SystemUsesLightTheme 0", "sh:gsettings set org.gnome.desktop.interface color-scheme prefer-dark 2>/dev/null || echo 'set dark theme in Appearance settings'")
37
+ CMD["dark_mode_off"] = K("ps:Set-ItemProperty HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize AppsUseLightTheme 1; Set-ItemProperty HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize SystemUsesLightTheme 1", "sh:gsettings set org.gnome.desktop.interface color-scheme prefer-light 2>/dev/null || echo 'set light theme in Appearance settings'")
38
+ CMD["screen_off"] = K("ps:(Add-Type '[DllImport(\"user32.dll\")]public static extern int SendMessage(int hWnd,int hMsg,int wParam,int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)", "sh:wlr-randr --output HDMI-A-1 --off 2>/dev/null || xset dpms force off")
39
+ CMD["display_mode"] = K("cmd:{mode_cmd}", None)
40
+ CMD["list_displays"] = K("ps:Get-CimInstance Win32_VideoController | Select-Object Name,CurrentHorizontalResolution,CurrentVerticalResolution,CurrentRefreshRate", "sh:kmsprint 2>/dev/null || wlr-randr 2>/dev/null || xrandr")
41
+ CMD["set_resolution"] = K("ps:Write-Output 'Windows has no built-in CLI for resolution; opening Display settings'; start ms-settings:display", "sh:wlr-randr --output $(wlr-randr | head -1 | cut -d' ' -f1) --mode {resolution} 2>/dev/null || xrandr -s {resolution}")
42
+ CMD["set_display_scale"] = K("ps:start ms-settings:display; Write-Output 'set scale to {value}% in Display settings'", "sh:wlr-randr --output $(wlr-randr | head -1 | cut -d' ' -f1) --scale $(echo 'scale=2; {value}/100' | bc)")
43
+ CMD["set_refresh_rate"] = K("ps:start ms-settings:display-advanced; Write-Output 'choose {value} Hz'", "sh:M=$(wlr-randr | grep -m1 current | awk '{{print $1}}'); wlr-randr --output $(wlr-randr | head -1 | cut -d' ' -f1) --mode ${{M}}@{value}")
44
+ CMD["rotate_screen"] = K("ps:start ms-settings:display; Write-Output 'orientation {orientation}'", "sh:wlr-randr --output $(wlr-randr | head -1 | cut -d' ' -f1) --transform {orientation_wl}")
45
+ CMD["high_contrast_on"] = K("key:shift+alt+printscreen", "sh:gsettings set org.gnome.desktop.a11y.interface high-contrast true 2>/dev/null || echo 'enable High Contrast in Accessibility'")
46
+ CMD["high_contrast_off"] = K("key:shift+alt+printscreen", "sh:gsettings set org.gnome.desktop.a11y.interface high-contrast false 2>/dev/null || echo 'disable High Contrast in Accessibility'")
47
+ CMD["set_wallpaper"] = K("ps:Add-Type -TypeDefinition 'using System.Runtime.InteropServices; public class W {{ [DllImport(\"user32.dll\")] public static extern int SystemParametersInfo(int a,int b,string c,int d); }}'; [W]::SystemParametersInfo(20,0,(Resolve-Path {path}),3)", "sh:pcmanfm --set-wallpaper {path} 2>/dev/null || gsettings set org.gnome.desktop.background picture-uri file://$(realpath {path})")
48
+ CMD["screenshot"] = K("ps:" + WIN_SCREENSHOT, "sh:grim ~/Pictures/shot_$(date +%s).png 2>/dev/null || scrot ~/Pictures/shot_$(date +%s).png; echo saved")
49
+ CMD["screen_record_start"] = K("key:win+alt+r", "sh:(wf-recorder -f ~/Videos/rec_$(date +%s).mp4 >/dev/null 2>&1 &) && echo recording")
50
+ CMD["screen_record_stop"] = K("key:win+alt+r", "sh:pkill -INT wf-recorder && echo stopped")
51
+ CMD["fullscreen"] = K("key:f11", "key:F11")
52
+ CMD["magnifier_on"] = K("key:win+plus", "sh:echo 'no magnifier on Pi OS; use zoom'")
53
+ CMD["magnifier_off"] = K("key:win+escape", "sh:echo 'no magnifier on Pi OS'")
54
+ CMD["narrator_on"] = K("key:win+ctrl+enter", "sh:orca & 2>/dev/null || echo 'install orca'")
55
+ CMD["narrator_off"] = K("key:win+ctrl+enter", "sh:pkill orca")
56
+ CMD["onscreen_keyboard"] = K("cmd:start osk", "sh:onboard & 2>/dev/null || matchbox-keyboard &")
57
+ # ------------------------------------------------------------------ power / session
58
+ CMD["shutdown"] = K("cmd:shutdown /s /t {seconds}", "sh:{sudo}shutdown -h +{minutes}")
59
+ CMD["restart"] = K("cmd:shutdown /r /t {seconds}", "sh:{sudo}shutdown -r +{minutes}")
60
+ CMD["cancel_shutdown"] = K("cmd:shutdown /a", "sh:{sudo}shutdown -c")
61
+ CMD["sleep"] = K("cmd:rundll32.exe powrprof.dll,SetSuspendState 0,1,0", "sh:{sudo}systemctl suspend")
62
+ CMD["hibernate"] = K("cmd:shutdown /h", "sh:{sudo}systemctl hibernate")
63
+ CMD["lock_screen"] = K("cmd:rundll32.exe user32.dll,LockWorkStation", "sh:loginctl lock-session 2>/dev/null || xdg-screensaver lock")
64
+ CMD["sign_out"] = K("cmd:shutdown /l", "sh:loginctl terminate-user $USER")
65
+ CMD["switch_user"] = K("cmd:tsdiscon", "sh:dm-tool switch-to-greeter 2>/dev/null || echo 'no display manager switch'")
66
+ CMD["battery_saver_on"] = K("cmd:powercfg /setactive a1841308-3541-4fab-bc81-f71556f20b4a", "sh:echo powersave | {sudo}tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor")
67
+ CMD["battery_saver_off"] = K("cmd:powercfg /setactive 381b4222-f694-41f0-9685-ff5bb260df2e", "sh:echo ondemand | {sudo}tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor")
68
+ CMD["get_battery"] = K("ps:Get-CimInstance Win32_Battery | Select-Object EstimatedChargeRemaining,BatteryStatus", "sh:cat /sys/class/power_supply/BAT*/capacity 2>/dev/null || echo 'no battery (mains powered)'")
69
+ CMD["power_mode"] = K("cmd:powercfg /setactive {power_guid}", "sh:echo {governor_for_mode} | {sudo}tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor")
70
+ CMD["set_cpu_governor"] = K(None, "sh:echo {governor} | {sudo}tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor")
71
+ CMD["get_cpu_governor"] = K("cmd:powercfg /getactivescheme", "sh:cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor")
72
+ # ------------------------------------------------------------------ network
73
+ CMD["wifi_on"] = K("cmd:netsh interface set interface Wi-Fi enabled", "sh:{sudo}nmcli radio wifi on")
74
+ CMD["wifi_off"] = K("cmd:netsh interface set interface Wi-Fi disabled", "sh:{sudo}nmcli radio wifi off")
75
+ CMD["bluetooth_on"] = K("ps:" + WIN_BT.replace("STATE", "On"), "sh:{sudo}rfkill unblock bluetooth; bluetoothctl power on")
76
+ CMD["bluetooth_off"] = K("ps:" + WIN_BT.replace("STATE", "Off"), "sh:bluetoothctl power off")
77
+ CMD["bluetooth_connect"] = K("cmd:start ms-settings:bluetooth", "sh:MAC=$(bluetoothctl devices | grep -i {device} | awk '{{print $2}}' | head -1); [ -n \"$MAC\" ] && bluetoothctl connect $MAC || echo 'device not paired'")
78
+ CMD["list_bluetooth_devices"] = K("ps:Get-PnpDevice -Class Bluetooth | Where-Object Status -eq OK | Select-Object FriendlyName", "sh:bluetoothctl devices; timeout 5 bluetoothctl scan on 2>/dev/null")
79
+ CMD["airplane_mode_on"] = K("cmd:start ms-settings:network-airplanemode", "sh:{sudo}rfkill block all")
80
+ CMD["airplane_mode_off"] = K("cmd:start ms-settings:network-airplanemode", "sh:{sudo}rfkill unblock all")
81
+ CMD["hotspot_on"] = K("cmd:start ms-settings:network-mobilehotspot", "sh:{sudo}nmcli dev wifi hotspot ssid {ssid}{pw_arg}")
82
+ CMD["hotspot_off"] = K("cmd:start ms-settings:network-mobilehotspot", "sh:{sudo}nmcli con down Hotspot")
83
+ CMD["connect_wifi"] = K('ps:$s={ssid}; $p={password}; $e=[Security.SecurityElement]::Escape($s); $known=(netsh wlan show profiles) -match (\':\\s*\'+[regex]::Escape($s)+\'\\s*$\'); if ($p -or -not $known) {{ if ($p) {{ $sec=\'<authEncryption><authentication>WPA2PSK</authentication><encryption>AES</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>\'+[Security.SecurityElement]::Escape($p)+\'</keyMaterial></sharedKey>\' }} else {{ $sec=\'<authEncryption><authentication>open</authentication><encryption>none</encryption><useOneX>false</useOneX></authEncryption>\' }}; $x=\'<?xml version="1.0"?><WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1"><name>\'+$e+\'</name><SSIDConfig><SSID><name>\'+$e+\'</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>auto</connectionMode><MSM><security>\'+$sec+\'</security></MSM></WLANProfile>\'; $f=Join-Path $env:TEMP (\'wifi_\'+[guid]::NewGuid()+\'.xml\'); [IO.File]::WriteAllText($f,$x); netsh wlan add profile filename="$f" user=current; Remove-Item $f }}; netsh wlan connect name="$s" ssid="$s"', 'sh:{sudo}nmcli dev wifi connect {ssid}{pw_arg} || {sudo}nmcli con up id {ssid}')
84
+ CMD["disconnect_wifi"] = K("cmd:netsh wlan disconnect", "sh:{sudo}nmcli dev disconnect wlan0")
85
+ CMD["forget_wifi"] = K("cmd:netsh wlan delete profile name={ssid}", "sh:{sudo}nmcli con delete {ssid}")
86
+ CMD["show_wifi_password"] = K("cmd:netsh wlan show profile name={ssid} key=clear", "sh:{sudo}nmcli -s -g 802-11-wireless-security.psk con show {ssid}")
87
+ CMD["list_wifi"] = K("cmd:netsh wlan show networks mode=bssid", "sh:nmcli dev wifi rescan; nmcli dev wifi list")
88
+ CMD["get_wifi_signal"] = K("cmd:netsh wlan show interfaces", "sh:iw dev wlan0 link")
89
+ CMD["network_status"] = K("cmd:netsh interface show interface & ping -n 1 8.8.8.8", "sh:nmcli dev status; nmcli networking connectivity")
90
+ CMD["get_ip"] = K("cmd:ipconfig", "sh:hostname -I; ip -br a")
91
+ CMD["get_public_ip"] = K("ps:(Invoke-RestMethod https://api.ipify.org)", "sh:curl -s https://api.ipify.org; echo")
92
+ CMD["get_mac_address"] = K("cmd:getmac /v", "sh:ip -br link")
93
+ CMD["get_default_gateway"] = K("cmd:route print 0.0.0.0", "sh:ip r")
94
+ CMD["list_arp"] = K("cmd:arp -a", "sh:ip neigh")
95
+ CMD["list_connections"] = K("cmd:netstat -an", "sh:ss -tun")
96
+ CMD["list_open_ports"] = K("cmd:netstat -ano | findstr LISTENING", "sh:{sudo}ss -tulnp")
97
+ CMD["ping"] = K("cmd:ping -n 3 {host}", "sh:ping -c 3 -W 1 -- {host}")
98
+ CMD["traceroute"] = K("cmd:tracert -d {host}", "sh:mtr -r -c 10 {host} 2>/dev/null || traceroute {host}")
99
+ CMD["dns_lookup"] = K("cmd:nslookup {host}", "sh:dig +short {host} || nslookup {host}")
100
+ CMD["flush_dns"] = K("cmd:ipconfig /flushdns", "sh:{sudo}resolvectl flush-caches 2>/dev/null || {sudo}systemd-resolve --flush-caches")
101
+ CMD["speed_test"] = K("ps:Write-Output 'requires speedtest-cli'; speedtest-cli --simple", "sh:speedtest-cli --simple")
102
+ CMD["check_port"] = K("ps:Test-NetConnection {host} -Port {port}", "sh:nc -zv -w 3 {host} {port}")
103
+ CMD["scan_lan"] = K("cmd:arp -a", "sh:nmap -sn $(ip -o -f inet addr show | awk '/wlan0|eth0/ {{print $4; exit}}')")
104
+ CMD["scan_ports"] = K("ps:1..1024 | ForEach-Object {{ if((Test-NetConnection {host} -Port $_ -InformationLevel Quiet)){{$_}} }}", "sh:nmap -p 1-1024 {host}")
105
+ CMD["discover_devices"] = K("cmd:arp -a", "sh:avahi-browse -art | grep -E 'hostname|address' | sort -u")
106
+ CMD["get_ethernet_status"] = K("cmd:netsh interface show interface", "sh:ethtool eth0 | grep -E 'Speed|Duplex|Link'")
107
+ CMD["get_bandwidth_usage"] = K("ps:Get-NetAdapterStatistics | Select-Object Name,ReceivedBytes,SentBytes", "sh:vnstat 2>/dev/null || {sudo}iftop -t -s 5 -i wlan0")
108
+ CMD["get_radio_status"] = K("cmd:netsh interface show interface", "sh:rfkill list")
109
+ CMD["run_network_benchmark"] = K("ps:iperf3 -c {host} -t 10", "sh:iperf3 -c {host} -t 10")
110
+ CMD["packet_capture"] = K("ps:pktmon start --capture; Start-Sleep 10; pktmon stop", "sh:{sudo}timeout 15 tcpdump -i {iface} -c 100")
111
+ CMD["vpn_connect"] = K("cmd:rasdial", "sh:{sudo}nmcli con up $(nmcli -t -f NAME,TYPE con show | grep vpn | cut -d: -f1 | head -1)")
112
+ CMD["vpn_disconnect"] = K("cmd:rasdial /disconnect", "sh:{sudo}nmcli con down $(nmcli -t -f NAME,TYPE con show --active | grep vpn | cut -d: -f1 | head -1)")
113
+ CMD["firewall_on"] = K("cmd:netsh advfirewall set allprofiles state on", "sh:{sudo}ufw --force enable")
114
+ CMD["firewall_off"] = K("cmd:netsh advfirewall set allprofiles state off", "sh:{sudo}ufw disable")
115
+ CMD["firewall_status"] = K("cmd:netsh advfirewall show allprofiles state", "sh:{sudo}ufw status verbose")
116
+ CMD["firewall_allow"] = K("cmd:netsh advfirewall firewall add rule name=allow_{port} dir=in action=allow protocol=TCP localport={port}", "sh:{sudo}ufw allow {port}")
117
+ CMD["firewall_deny"] = K("cmd:netsh advfirewall firewall add rule name=deny_{port} dir=in action=block protocol=TCP localport={port}", "sh:{sudo}ufw deny {port}")
118
+ CMD["list_banned_ips"] = K(None, "sh:{sudo}fail2ban-client status sshd")
119
+ CMD["unban_ip"] = K(None, "sh:{sudo}fail2ban-client set sshd unbanip {ip}")
120
+ CMD["remote_shell"] = K("cmd:start ssh {user}@{host}", "sh:x-terminal-emulator -e ssh {user}@{host} &")
121
+ CMD["copy_ssh_key"] = K("ps:type $env:USERPROFILE\\.ssh\\id_ed25519.pub | ssh {host} 'cat >> .ssh/authorized_keys'", "sh:ssh-copy-id {host}")
122
+ CMD["port_forward"] = K("cmd:start ssh -L {port}:localhost:{port} {host}", "sh:(ssh -N -L {port}:localhost:{port} {host} &) && echo 'tunnel up'")
123
+ CMD["transfer_files"] = K("cmd:scp -r {file} {host}:~/", "sh:rsync -avz --progress {file} {host}:~/ 2>/dev/null || scp -r {file} {host}:~/")
124
+ CMD["download_file"] = K("ps:Invoke-WebRequest {url} -OutFile (Split-Path -Leaf {url})", "sh:cd ~/Downloads 2>/dev/null; wget -c {url}")
125
+ # ------------------------------------------------------------------ apps / windows / browser / keys
126
+ CMD["open_app"] = K("cmd:{app_win}", "sh:{app_pi}")
127
+ CMD["close_app"] = K("cmd:taskkill /im {proc_win}", "sh:pkill -f {proc_pi}")
128
+ CMD["switch_to_app"] = K("ps:(New-Object -ComObject WScript.Shell).AppActivate({app})", "sh:wmctrl -a {app} 2>/dev/null || xdotool search --name {app} windowactivate")
129
+ CMD["uninstall_app"] = K("cmd:winget uninstall {app}", "sh:{sudo}apt remove -y {app}")
130
+ CMD["list_installed_apps"] = K("cmd:winget list", "sh:dpkg-query -W -f='${{Package}}\\n' | head -200")
131
+ CMD["minimize_window"] = K("key:win+down", "key:super+h")
132
+ CMD["maximize_window"] = K("key:win+up", "key:super+Up")
133
+ CMD["close_window"] = K("key:alt+f4", "key:alt+F4")
134
+ CMD["show_desktop"] = K("key:win+d", "key:super+d")
135
+ CMD["switch_window"] = K("key:alt+tab", "key:alt+Tab")
136
+ CMD["snap_left"] = K("key:win+left", "key:super+Left")
137
+ CMD["snap_right"] = K("key:win+right", "key:super+Right")
138
+ CMD["task_view"] = K("key:win+tab", "key:super+Tab")
139
+ CMD["new_virtual_desktop"] = K("key:win+ctrl+d", "sh:echo 'no virtual desktops on Pi OS Wayfire'")
140
+ CMD["open_site"] = K("open:{site_url}", "open:{site_url}")
141
+ CMD["open_url"] = K("open:{url_full}", "open:{url_full}")
142
+ CMD["web_search"] = K("open:https://www.google.com/search?q={query_url}", "open:https://www.google.com/search?q={query_url}")
143
+ CMD["youtube_search"] = K("open:https://www.youtube.com/results?search_query={query_url}", "open:https://www.youtube.com/results?search_query={query_url}")
144
+ CMD["web_login"] = K("py:web_login", "py:web_login")
145
+ CMD["new_tab"] = K("key:ctrl+t", "key:ctrl+t"); CMD["close_tab"] = K("key:ctrl+w", "key:ctrl+w"); CMD["reopen_tab"] = K("key:ctrl+shift+t", "key:ctrl+shift+t")
146
+ CMD["next_tab"] = K("key:ctrl+tab", "key:ctrl+Tab"); CMD["prev_tab"] = K("key:ctrl+shift+tab", "key:ctrl+shift+Tab")
147
+ CMD["refresh"] = K("key:f5", "key:F5"); CMD["browser_back"] = K("key:alt+left", "key:alt+Left"); CMD["browser_forward"] = K("key:alt+right", "key:alt+Right")
148
+ CMD["zoom_in"] = K("key:ctrl+plus", "key:ctrl+plus"); CMD["zoom_out"] = K("key:ctrl+minus", "key:ctrl+minus"); CMD["zoom_reset"] = K("key:ctrl+0", "key:ctrl+0")
149
+ CMD["incognito_window"] = K("cmd:start msedge --inprivate", "sh:chromium-browser --incognito &")
150
+ CMD["bookmark_page"] = K("key:ctrl+d", "key:ctrl+d"); CMD["find_in_page"] = K("py:find_in_page", "py:find_in_page")
151
+ CMD["print_page"] = K("key:ctrl+p", "key:ctrl+p"); CMD["scroll_down"] = K("key:pagedown", "key:Page_Down"); CMD["scroll_up"] = K("key:pageup", "key:Page_Up")
152
+ CMD["media_play"] = K("key:media_play_pause", "sh:playerctl play 2>/dev/null || xdotool key XF86AudioPlay")
153
+ CMD["media_pause"] = K("key:media_play_pause", "sh:playerctl pause 2>/dev/null || xdotool key XF86AudioPause")
154
+ CMD["media_play_pause"] = K("key:media_play_pause", "sh:playerctl play-pause 2>/dev/null || xdotool key XF86AudioPlay")
155
+ CMD["media_next"] = K("key:media_next", "sh:playerctl next 2>/dev/null || xdotool key XF86AudioNext")
156
+ CMD["media_prev"] = K("key:media_prev", "sh:playerctl previous 2>/dev/null || xdotool key XF86AudioPrev")
157
+ CMD["copy"] = K("key:ctrl+c", "key:ctrl+c"); CMD["paste"] = K("key:ctrl+v", "key:ctrl+v"); CMD["cut"] = K("key:ctrl+x", "key:ctrl+x")
158
+ CMD["undo"] = K("key:ctrl+z", "key:ctrl+z"); CMD["redo"] = K("key:ctrl+y", "key:ctrl+y"); CMD["select_all"] = K("key:ctrl+a", "key:ctrl+a"); CMD["save_file"] = K("key:ctrl+s", "key:ctrl+s")
159
+ CMD["type_text"] = K("ps:Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait({text_sendkeys})", "sh:xdotool type --delay 20 {text} 2>/dev/null || wtype {text}")
160
+ CMD["press_key"] = K("key:{key}", "key:{key_x}")
161
+ CMD["emoji_panel"] = K("key:win+period", "sh:echo 'no emoji panel on Pi OS'")
162
+ CMD["switch_input_language"] = K("key:win+space", "sh:setxkbmap -query")
163
+ CMD["clipboard_history"] = K("key:win+v", "sh:echo 'install clipman / copyq for clipboard history'")
164
+ CMD["repeat_last"] = K("py:repeat_last", "py:repeat_last")
165
+ CMD["help"] = K("py:help", "py:help")
166
+ CMD["unknown"] = K("py:noop", "py:noop")
167
+ CMD["clarify"] = K("py:clarify", "py:clarify")
168
+ # ------------------------------------------------------------------ files
169
+ CMD["open_folder"] = K("cmd:explorer {folder_win}", "sh:xdg-open {folder_pi} &")
170
+ CMD["open_file"] = K("cmd:start \"\" {path}", "sh:xdg-open {path} &")
171
+ CMD["create_folder"] = K("ps:New-Item -ItemType Directory -Force -Path {path} | Out-Null; 'created'", "sh:mkdir -p -- {path} && echo created")
172
+ CMD["create_file"] = K("ps:New-Item -ItemType File -Force -Path {path} | Out-Null; 'created'", "sh:mkdir -p \"$(dirname {path})\" && touch -- {path} && echo created")
173
+ CMD["delete_file"] = K("ps:Remove-Item -LiteralPath {path} -Confirm:$false", "sh:rm -f -- {path} && echo deleted")
174
+ CMD["read_file"] = K("ps:Get-Content -LiteralPath {path} -TotalCount 200", "sh:head -n 200 -- {path}")
175
+ CMD["hash_file"] = K("ps:(Get-FileHash -LiteralPath {path} -Algorithm SHA256).Hash", "sh:sha256sum -- {path}")
176
+ CMD["list_files"] = K("ps:Get-ChildItem -LiteralPath {path} | Select-Object Mode,Length,Name", "sh:ls -la -- {path}")
177
+ CMD["copy_file"] = K("ps:Copy-Item -LiteralPath {src} -Destination {dst}; 'copied'", "sh:cp -r -- {src} {dst} && echo copied")
178
+ CMD["move_file"] = K("ps:Move-Item -LiteralPath {src} -Destination {dst}; 'moved'", "sh:mv -- {src} {dst} && echo moved")
179
+ CMD["rename_file"] = K("ps:Rename-Item -LiteralPath {src} -NewName {dst}; 'renamed'", "sh:mv -- {src} {dst} && echo renamed")
180
+ CMD["search_files"] = K("ps:Get-ChildItem $env:USERPROFILE -Recurse -Filter *{query}* -ErrorAction SilentlyContinue | Select-Object -First 50 FullName", "sh:find ~ -iname '*'{query}'*' 2>/dev/null | head -50")
181
+ CMD["search_in_files"] = K("ps:Get-ChildItem $env:USERPROFILE -Recurse -File -ErrorAction SilentlyContinue | Select-String -Pattern {query} -List | Select-Object -First 50 Path", "sh:grep -rIl -- {query} ~ 2>/dev/null | head -50")
182
+ CMD["recent_files"] = K("cmd:explorer shell:recent", "sh:ls -lt ~ ~/Documents ~/Downloads 2>/dev/null | head -30")
183
+ CMD["compress_file"] = K("ps:Compress-Archive -LiteralPath {path} -DestinationPath ({path}+'.zip') -Force; 'zipped'", "sh:zip -r -- {path}.zip {path} && echo zipped")
184
+ CMD["extract_archive"] = K("ps:Expand-Archive -LiteralPath {path} -DestinationPath . -Force; 'extracted'", "sh:case {path} in *.zip) unzip -o -- {path};; *.tar.gz|*.tgz) tar -xzvf {path};; *) 7z x -- {path};; esac")
185
+ CMD["open_recycle_bin"] = K("cmd:explorer shell:RecycleBinFolder", "sh:xdg-open trash:/// &")
186
+ CMD["empty_recycle_bin"] = K("ps:Clear-RecycleBin -Force", "sh:rm -rf ~/.local/share/Trash/files/* ~/.local/share/Trash/info/* && echo emptied")
187
+ CMD["clear_temp_files"] = K("ps:Remove-Item $env:TEMP\\* -Recurse -Force -ErrorAction SilentlyContinue; 'temp cleared'", "sh:{sudo}apt clean; rm -rf ~/.cache/thumbnails/*; echo cleared")
188
+ CMD["get_folder_sizes"] = K("ps:Get-ChildItem $env:USERPROFILE -Directory | ForEach-Object {{ [pscustomobject]@{{Folder=$_.Name; MB=[int]((Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum/1MB)}} }} | Sort-Object MB -Descending", "sh:du -h --max-depth=1 ~ 2>/dev/null | sort -h | tail -20")
189
+ CMD["create_symlink"] = K("cmd:mklink /D {link} {path}", "sh:ln -s -- {path} {link} && echo linked")
190
+ CMD["set_permissions"] = K("cmd:icacls {path} /grant %USERNAME%:F", "sh:chmod +x -- {path} && ls -l -- {path}")
191
+ CMD["set_owner"] = K("cmd:icacls {path} /setowner {user}", "sh:{sudo}chown -R {user}:{user} -- {path}")
192
+ CMD["print_file"] = K("ps:Start-Process -FilePath {path} -Verb Print", "sh:lp -- {path}")
193
+ CMD["list_printers"] = K("ps:Get-Printer | Select-Object Name,DriverName,PortName", "sh:lpstat -p -d")
194
+ CMD["set_default_printer"] = K("ps:(Get-CimInstance Win32_Printer | Where-Object Name -match {name}) | Invoke-CimMethod -MethodName SetDefaultPrinter", "sh:lpadmin -d {name}")
195
+ # ------------------------------------------------------------------ system info
196
+ CMD["get_system_info"] = K("cmd:systeminfo | findstr /B /C:\"OS Name\" /C:\"OS Version\" /C:\"System Model\" /C:\"Processor\" /C:\"Total Physical\"", "sh:cat /proc/device-tree/model; echo; uname -a; grep PRETTY /etc/os-release; lscpu | grep -E 'Model name|CPU\\(s\\)'; free -h | head -2")
197
+ CMD["get_kernel_version"] = K("cmd:ver", "sh:uname -r; uname -m")
198
+ CMD["get_hostname"] = K("cmd:hostname", "sh:hostname")
199
+ CMD["get_current_user"] = K("cmd:whoami", "sh:whoami; id")
200
+ CMD["list_logged_in_users"] = K("cmd:query user", "sh:w")
201
+ CMD["get_time"] = K("cmd:echo %time%", "sh:date +%T")
202
+ CMD["get_date"] = K("cmd:echo %date%", "sh:date '+%A %d %B %Y'")
203
+ CMD["get_uptime"] = K("ps:(Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime", "sh:uptime -p")
204
+ CMD["get_load_average"] = K("ps:Get-CimInstance Win32_Processor | Select-Object LoadPercentage", "sh:cat /proc/loadavg")
205
+ CMD["get_cpu_usage"] = K("ps:Get-CimInstance Win32_Processor | Select-Object Name,LoadPercentage", "sh:top -bn1 | head -5")
206
+ CMD["get_per_core_usage"] = K("ps:Get-Counter '\\Processor(*)\\% Processor Time' | Select-Object -Expand CounterSamples | Select-Object InstanceName,CookedValue", "sh:mpstat -P ALL 1 1 2>/dev/null || cat /proc/stat | head -6")
207
+ CMD["get_ram_usage"] = K("ps:Get-CimInstance Win32_OperatingSystem | Select-Object FreePhysicalMemory,TotalVisibleMemorySize", "sh:free -h")
208
+ CMD["get_swap_usage"] = K("ps:Get-CimInstance Win32_PageFileUsage | Select-Object Name,AllocatedBaseSize,CurrentUsage", "sh:swapon --show; free -h | grep -i swap")
209
+ CMD["get_gpu_memory"] = K("ps:Get-CimInstance Win32_VideoController | Select-Object Name,AdapterRAM", "sh:vcgencmd get_mem arm; vcgencmd get_mem gpu")
210
+ CMD["get_gpu_usage"] = K("cmd:nvidia-smi 2>nul || echo use Task Manager > Performance > GPU", "sh:cat /sys/kernel/debug/dri/*/gpu_usage 2>/dev/null || vcgencmd measure_clock v3d")
211
+ CMD["get_disk_space"] = K("ps:Get-PSDrive -PSProvider FileSystem | Select-Object Name,@{{n='UsedGB';e={{[int]($_.Used/1GB)}}}},@{{n='FreeGB';e={{[int]($_.Free/1GB)}}}}", "sh:df -h / /boot/firmware 2>/dev/null || df -h")
212
+ CMD["list_disks"] = K("ps:Get-Disk | Select-Object Number,FriendlyName,Size,HealthStatus", "sh:lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL")
213
+ CMD["list_partitions"] = K("ps:Get-Partition | Select-Object DiskNumber,PartitionNumber,DriveLetter,Size,Type", "sh:lsblk -f")
214
+ CMD["get_disk_health"] = K("ps:Get-PhysicalDisk | Select-Object FriendlyName,HealthStatus,OperationalStatus,Size", "sh:{sudo}smartctl -H /dev/mmcblk0 2>/dev/null; {sudo}smartctl -a /dev/nvme0 2>/dev/null | head -40 || echo 'install smartmontools'")
215
+ CMD["get_disk_io"] = K("ps:Get-Counter '\\PhysicalDisk(_Total)\\Disk Bytes/sec'", "sh:{sudo}iotop -b -o -n 3 2>/dev/null || cat /proc/diskstats")
216
+ CMD["disk_read_speed"] = K("ps:winsat disk -ran -read -drive c", "sh:{sudo}hdparm -tT /dev/mmcblk0 2>/dev/null || {sudo}hdparm -tT /dev/nvme0n1")
217
+ CMD["disk_write_speed"] = K("ps:winsat disk -seq -write -drive c", "sh:dd if=/dev/zero of=~/test.img bs=1M count=256 conv=fsync oflag=direct 2>&1 | tail -1; rm -f ~/test.img")
218
+ CMD["get_sdcard_info"] = K(None, "sh:echo -n 'cid='; cat /sys/block/mmcblk0/device/cid; echo -n 'name='; cat /sys/block/mmcblk0/device/name; echo -n 'oemid='; cat /sys/block/mmcblk0/device/oemid")
219
+ CMD["list_processes"] = K("cmd:tasklist /FO TABLE", "sh:ps -eo pid,user,%cpu,%mem,comm --sort=-%cpu | head -30")
220
+ CMD["kill_process"] = K("cmd:taskkill /PID {pid} /F", "sh:kill -15 {pid} && echo 'sent SIGTERM'")
221
+ CMD["set_process_priority"] = K("ps:(Get-Process -Id {pid}).PriorityClass='BelowNormal'", "sh:{sudo}renice -n {priority_num} -p {pid}")
222
+ CMD["set_cpu_affinity"] = K("ps:(Get-Process -Id {pid}).ProcessorAffinity={cores}", "sh:taskset -pc {cores} {pid}")
223
+ CMD["list_open_files"] = K("ps:Get-Process | Where-Object {{$_.Modules.FileName -like '*{device}*'}} | Select-Object Id,ProcessName", "sh:{sudo}lsof {device} 2>/dev/null || {sudo}fuser -v {device}")
224
+ CMD["show_command_history"] = K("cmd:doskey /history", "sh:tail -40 ~/.bash_history")
225
+ CMD["find_command"] = K("cmd:where {name}", "sh:command -v {name} && {name} --version 2>/dev/null | head -1 || echo 'not installed'")
226
+ CMD["list_services"] = K("cmd:sc query type=service state=all", "sh:systemctl list-units --type=service --state=running")
227
+ CMD["list_failed_services"] = K("cmd:sc query type=service state=inactive", "sh:systemctl --failed")
228
+ CMD["service_status"] = K("cmd:sc query {svc_win}", "sh:systemctl status {svc_unit} --no-pager | head -12")
229
+ CMD["service_start"] = K("cmd:net start {svc_win}", "sh:{sudo}systemctl start {svc_unit} && systemctl is-active {svc_unit}")
230
+ CMD["service_stop"] = K("cmd:net stop {svc_win}", "sh:{sudo}systemctl stop {svc_unit} && systemctl is-active {svc_unit}")
231
+ CMD["service_restart"] = K("cmd:net stop {svc_win} & net start {svc_win}", "sh:{sudo}systemctl restart {svc_unit} && systemctl is-active {svc_unit}")
232
+ CMD["service_enable"] = K("cmd:sc config {svc_win} start=auto", "sh:{sudo}systemctl enable --now {svc_unit}")
233
+ CMD["service_disable"] = K("cmd:sc config {svc_win} start=disabled", "sh:{sudo}systemctl disable --now {svc_unit}")
234
+ CMD["get_service_logs"] = K("ps:Get-EventLog -LogName System -Newest 30 | Where-Object Source -match {service}", "sh:journalctl -u {svc_unit} -n 40 --no-pager")
235
+ CMD["get_kernel_log"] = K("ps:Get-EventLog -LogName System -Newest 40", "sh:{sudo}dmesg | tail -40")
236
+ CMD["get_boot_logs"] = K("ps:Get-WinEvent -FilterHashtable @{{LogName='System'}} -MaxEvents 50", "sh:journalctl -b -1 -p err --no-pager | tail -40")
237
+ CMD["get_boot_time"] = K("ps:(Get-CimInstance Win32_OperatingSystem).LastBootUpTime", "sh:systemd-analyze; systemd-analyze blame | head -10")
238
+ CMD["get_reboot_history"] = K("ps:Get-WinEvent -FilterHashtable @{{LogName='System';Id=1074,6008}} -MaxEvents 15 | Select-Object TimeCreated,Id", "sh:last -x | head -15")
239
+ CMD["get_diagnostics"] = K("cmd:msinfo32 /report %USERPROFILE%\\diag.txt & echo saved %USERPROFILE%\\diag.txt", "sh:raspinfo > ~/raspinfo.txt && echo 'saved ~/raspinfo.txt'")
240
+ CMD["get_boot_config"] = K("cmd:bcdedit /enum", "sh:vcgencmd get_config int; grep -v '^#' /boot/firmware/config.txt | grep .")
241
+ CMD["get_time_sync"] = K("cmd:w32tm /query /status", "sh:timedatectl")
242
+ CMD["sync_time"] = K("cmd:w32tm /resync", "sh:{sudo}timedatectl set-ntp true && timedatectl timesync-status")
243
+ CMD["set_timezone"] = K("cmd:tzutil /s {tz_win}", "sh:{sudo}timedatectl set-timezone {tz}")
244
+ CMD["set_locale"] = K("ps:Set-WinSystemLocale {locale}", "sh:{sudo}raspi-config nonint do_change_locale {locale}")
245
+ CMD["set_keyboard_layout"] = K("ps:Set-WinUserLanguageList {layout} -Force", "sh:{sudo}raspi-config nonint do_configure_keyboard {layout}")
246
+ CMD["get_cpu_pressure"] = K(None, "sh:cat /proc/pressure/cpu"); CMD["get_memory_pressure"] = K(None, "sh:cat /proc/pressure/memory")
247
+ CMD["get_slab_usage"] = K(None, "sh:{sudo}slabtop -o | head -20"); CMD["drop_caches"] = K(None, "sh:sync; echo 3 | {sudo}tee /proc/sys/vm/drop_caches")
248
+ CMD["get_interrupts"] = K(None, "sh:head -30 /proc/interrupts"); CMD["list_kernel_modules"] = K("cmd:driverquery", "sh:lsmod | head -40")
249
+ CMD["monitor_hotplug"] = K(None, "sh:timeout 20 udevadm monitor --udev"); CMD["monitor_health"] = K(None, "sh:for i in 1 2 3 4 5; do vcgencmd measure_temp; vcgencmd measure_clock arm; vcgencmd get_throttled; sleep 1; done")
250
+ CMD["check_updates"] = K("cmd:winget upgrade", "sh:{sudo}apt update >/dev/null 2>&1; apt list --upgradable 2>/dev/null")
251
+ CMD["install_updates"] = K("cmd:winget upgrade --all", "sh:{sudo}apt update && {sudo}apt full-upgrade -y")
252
+ CMD["update_packages"] = K("cmd:winget source update", "sh:{sudo}apt update")
253
+ CMD["install_package"] = K("cmd:winget install --accept-package-agreements --accept-source-agreements {name}", "sh:{sudo}apt install -y {name}")
254
+ CMD["uninstall_package"] = K("cmd:winget uninstall {name}", "sh:{sudo}apt remove -y {name}")
255
+ CMD["search_package"] = K("cmd:winget search {name}", "sh:apt search {name} 2>/dev/null | head -20")
256
+ CMD["list_packages"] = K("cmd:winget list", "sh:dpkg -l | wc -l; dpkg -l | tail -30")
257
+ CMD["repair_packages"] = K("cmd:sfc /scannow", "sh:{sudo}dpkg --configure -a; {sudo}apt install -f -y")
258
+ CMD["install_python_package"] = K("cmd:pip install {name}", "sh:pip install {name} 2>/dev/null || pip install --break-system-packages {name}")
259
+ CMD["create_virtualenv"] = K("cmd:python -m venv {path}", "sh:python3 -m venv --system-site-packages {path} && echo created")
260
+ CMD["enable_auto_updates"] = K("ps:Set-ItemProperty HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU NoAutoUpdate 0", "sh:{sudo}apt install -y unattended-upgrades && {sudo}dpkg-reconfigure -plow unattended-upgrades")
261
+ CMD["disable_auto_updates"] = K("ps:Set-ItemProperty HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU NoAutoUpdate 1", "sh:{sudo}systemctl disable --now unattended-upgrades")
262
+ CMD["antivirus_scan"] = K("ps:Start-MpScan -ScanType QuickScan", "sh:clamscan -r ~ 2>/dev/null || echo 'install clamav'")
263
+ CMD["open_settings"] = K("cmd:start {page_uri}", "sh:x-terminal-emulator -e sudo raspi-config &")
264
+ CMD["open_config_tool"] = K("cmd:start ms-settings:", "sh:x-terminal-emulator -e sudo raspi-config &")
265
+ CMD["open_notification_center"] = K("key:win+n", "sh:echo 'no notification center on Pi OS'"); CMD["clear_notifications"] = K("cmd:start ms-settings:notifications", "sh:echo 'no notification center on Pi OS'")
266
+ CMD["dnd_on"] = K("cmd:start ms-settings:quiethours", "sh:echo 'no DND on Pi OS'"); CMD["dnd_off"] = K("cmd:start ms-settings:quiethours", "sh:echo 'no DND on Pi OS'")
267
+ CMD["set_mouse_speed"] = K("cmd:start ms-settings:mousetouchpad", "sh:echo 'set pointer speed in Mouse and Touchpad settings'")
268
+ CMD["touchpad_on"] = K("cmd:start ms-settings:devices-touchpad", "sh:xinput enable $(xinput list | grep -i touchpad | grep -o 'id=[0-9]*' | cut -d= -f2)")
269
+ CMD["touchpad_off"] = K("cmd:start ms-settings:devices-touchpad", "sh:xinput disable $(xinput list | grep -i touchpad | grep -o 'id=[0-9]*' | cut -d= -f2)")
270
+ CMD["set_timer"] = K("py:timer", "py:timer"); CMD["cancel_timer"] = K("py:cancel_timer", "py:cancel_timer")
271
+ CMD["set_alarm"] = K("py:alarm", "py:alarm"); CMD["cancel_alarm"] = K("py:cancel_alarm", "py:cancel_alarm")
272
+ CMD["set_reminder"] = K("py:reminder", "py:reminder"); CMD["stopwatch_start"] = K("py:stopwatch_start", "py:stopwatch_start"); CMD["stopwatch_stop"] = K("py:stopwatch_stop", "py:stopwatch_stop")
273
+ CMD["calculate"] = K("py:calculate", "py:calculate")
274
+ CMD["create_calendar_event"] = K("cmd:start outlookcal:", "sh:echo 'event: {title} at {time}' >> ~/calendar.txt && echo added")
275
+ CMD["send_message"] = K("py:send_message", "py:send_message"); CMD["send_email"] = K("open:mailto:{to}?subject={subject_url}&body={text_url}", "open:mailto:{to}?subject={subject_url}&body={text_url}")
276
+ CMD["camera_photo"] = K("cmd:start microsoft.windows.camera:", "sh:rpicam-still -o ~/photo_$(date +%s).jpg && echo saved")
277
+ CMD["camera_video"] = K("cmd:start microsoft.windows.camera:", "sh:rpicam-vid -t {seconds}000 -o ~/video_$(date +%s).h264 && echo saved")
278
+ CMD["list_cameras"] = K("ps:Get-PnpDevice -Class Camera,Image | Select-Object FriendlyName,Status", "sh:rpicam-hello --list-cameras 2>/dev/null; v4l2-ctl --list-devices 2>/dev/null")
279
+ CMD["list_usb"] = K("ps:Get-PnpDevice -PresentOnly | Where-Object InstanceId -like 'USB*' | Select-Object FriendlyName", "sh:lsusb")
280
+ CMD["list_pci"] = K("ps:Get-PnpDevice -PresentOnly | Where-Object InstanceId -like 'PCI*' | Select-Object FriendlyName", "sh:lspci")
281
+ CMD["list_serial_ports"] = K("ps:[System.IO.Ports.SerialPort]::GetPortNames()", "sh:ls -l /dev/tty{{AMA,USB,ACM,S}}* 2>/dev/null")
282
+ CMD["open_serial_terminal"] = K("cmd:start putty -serial {serial_port} -sercfg {baud}", "sh:x-terminal-emulator -e screen {serial_port} {baud} &")
283
+ CMD["list_spi_devices"] = K(None, "sh:ls -l /dev/spidev* 2>/dev/null || echo 'SPI not enabled'"); CMD["list_1wire_sensors"] = K(None, "sh:ls /sys/bus/w1/devices/ 2>/dev/null; cat /sys/bus/w1/devices/28-*/temperature 2>/dev/null")
284
+ CMD["load_overlay"] = K(None, "sh:{sudo}dtoverlay {overlay} && dtoverlay -l")
285
+ CMD["get_temperature"] = K("ps:Get-CimInstance -Namespace root/WMI -ClassName MSAcpi_ThermalZoneTemperature | Select-Object @{{n='C';e={{($_.CurrentTemperature-2732)/10}}}}", "sh:vcgencmd measure_temp")
286
+ CMD["get_throttle_status"] = K(None, "sh:vcgencmd get_throttled"); CMD["get_cpu_clock"] = K("ps:(Get-CimInstance Win32_Processor).CurrentClockSpeed", "sh:vcgencmd measure_clock arm")
287
+ CMD["get_voltage"] = K(None, "sh:vcgencmd measure_volts core"); CMD["get_power_draw"] = K("ps:powercfg /batteryreport", "sh:vcgencmd pmic_read_adc")
288
+ CMD["get_fan_speed"] = K(None, "sh:cat /sys/devices/platform/cooling_fan/hwmon/*/fan1_input 2>/dev/null || echo 'no fan'")
289
+ CMD["get_firmware_version"] = K("ps:(Get-CimInstance Win32_BIOS).SMBIOSBIOSVersion", "sh:vcgencmd version; rpi-eeprom-update 2>/dev/null | head -3")
290
+ CMD["get_firmware_log"] = K(None, "sh:{sudo}vclog --msg | tail -30"); CMD["flash_firmware"] = K("cmd:start ms-settings:windowsupdate", "sh:{sudo}rpi-eeprom-update -a")
291
+ CMD["check_ai_accelerator"] = K("ps:Get-PnpDevice | Where-Object FriendlyName -match 'NPU|Neural'", "sh:hailortcli fw-control identify 2>/dev/null || (lspci | grep -i hailo) || echo 'no AI HAT detected'")
292
+ CMD["run_stress_test"] = K("ps:Write-Output 'running CPU load for {seconds}s'; $j=1..4|%{{Start-Job {{ $e=(Get-Date).AddSeconds({seconds}); while((Get-Date) -lt $e){{}} }}}}; $j|Wait-Job|Out-Null; 'done'", "sh:stress-ng --cpu 4 --timeout {seconds}s --metrics-brief 2>/dev/null || echo 'install stress-ng'")
293
+ CMD["run_benchmark"] = K("cmd:winsat cpu -encryption", "sh:sysbench {target} run 2>/dev/null || echo 'install sysbench'")
294
+ CMD["set_boot_target"] = K(None, "sh:{sudo}systemctl set-default {boot_target}.target")
295
+ CMD["set_boot_order"] = K("cmd:bcdedit /enum firmware", "sh:{sudo}rpi-eeprom-config | grep BOOT_ORDER; echo 'edit with: sudo rpi-eeprom-config --edit (BOOT_ORDER=0xf416 = nvme,usb,sd)'")
296
+ CMD["edit_system_config"] = K("cmd:notepad {file}", "sh:x-terminal-emulator -e sudo nano {file} &")
297
+ CMD["expand_filesystem"] = K(None, "sh:{sudo}raspi-config nonint do_expand_rootfs && echo 'reboot to apply'")
298
+ CMD["set_swap_size"] = K("ps:start ms-settings:about; Write-Output 'Advanced system settings > Performance > Virtual memory'", "sh:{sudo}sed -i 's/^CONF_SWAPSIZE=.*/CONF_SWAPSIZE={size}/' /etc/dphys-swapfile && {sudo}dphys-swapfile swapoff && {sudo}dphys-swapfile setup && {sudo}dphys-swapfile swapon && free -h")
299
+ CMD["set_swappiness"] = K(None, "sh:{sudo}sysctl vm.swappiness={value}"); CMD["enable_zram"] = K(None, "sh:{sudo}apt install -y zram-tools && {sudo}systemctl restart zramswap && zramctl")
300
+ CMD["partition_disk"] = K("cmd:diskmgmt.msc", "sh:{sudo}fdisk -l {device}; echo 'interactive partitioning: sudo fdisk {device}'")
301
+ CMD["check_filesystem"] = K("cmd:chkdsk {device}", "sh:{sudo}umount {device} 2>/dev/null; {sudo}fsck -f -y {device}")
302
+ CMD["backup_disk_image"] = K("cmd:wbadmin start backup -backupTarget:D: -include:C:", "sh:{sudo}dd if={device} bs=4M status=progress | gzip > ~/backup_$(date +%s).img.gz")
303
+ CMD["clone_disk"] = K(None, "sh:{sudo}rpi-clone {device}")
304
+ CMD["set_disk_label"] = K("cmd:label {device} {label}", "sh:{sudo}e2label {device} {label}")
305
+ CMD["add_persistent_mount"] = K(None, "sh:U=$(sudo blkid -s UUID -o value {device}); echo \"UUID=$U /mnt/usb auto defaults,nofail 0 2\" | {sudo}tee -a /etc/fstab && {sudo}mount -a")
306
+ CMD["mount_drive"] = K("cmd:mountvol", "sh:{sudo}mkdir -p /mnt/usb && {sudo}mount {device} /mnt/usb && df -h /mnt/usb")
307
+ CMD["unmount_drive"] = K("ps:(New-Object -comObject Shell.Application).Namespace(17).ParseName({device}).InvokeVerb('Eject')", "sh:{sudo}umount {device} && echo unmounted")
308
+ CMD["format_drive"] = K("cmd:diskmgmt.msc", "sh:lsblk; echo 'formatting needs an explicit device: sudo mkfs.ext4 /dev/sdX'")
309
+ CMD["factory_reset"] = K("cmd:systemreset", "sh:echo 'no factory reset on Pi OS: re-flash the SD card with Raspberry Pi Imager'")
310
+ CMD["manage_users"] = K("cmd:net user {user} /add", "sh:{sudo}adduser --gecos '' {user}")
311
+ CMD["harden_ssh"] = K(None, "sh:{sudo}sed -i 's/^#\\?PasswordAuthentication.*/PasswordAuthentication no/;s/^#\\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config && {sudo}sshd -t && {sudo}systemctl restart ssh && echo hardened")
312
+ CMD["fix_gpio_permissions"] = K(None, "sh:{sudo}usermod -aG gpio,i2c,spi,dialout $USER && echo 're-login to apply'")
313
+ CMD["run_command"] = K("cmd:{command}", "sh:{command}"); CMD["run_script"] = K("cmd:start powershell", "sh:x-terminal-emulator &")
314
+ CMD["run_background"] = K("cmd:start /b {command}", "sh:nohup {command} > ~/bg.log 2>&1 & echo started")
315
+ CMD["schedule_task"] = K("cmd:schtasks /create /sc daily /tn union_task /tr {command}", "sh:(crontab -l 2>/dev/null; echo \"{cron_expr} {command}\") | crontab - && crontab -l")
316
+ CMD["create_service"] = K("cmd:sc create {name} binPath= C:\\Scripts\\{name}.bat start= auto", "sh:printf '[Unit]\\nDescription={name}\\nAfter=network.target\\n[Service]\\nExecStart=/home/%s/{name}.sh\\nRestart=on-failure\\n[Install]\\nWantedBy=multi-user.target\\n' $USER | {sudo}tee /etc/systemd/system/{name}.service && {sudo}systemctl daemon-reload")
317
+ CMD["start_session"] = K("cmd:start wt", "sh:tmux new -d -s {name} && tmux ls"); CMD["attach_session"] = K(None, "sh:x-terminal-emulator -e tmux a -t {name} &"); CMD["list_sessions"] = K("cmd:query session", "sh:tmux ls")
318
+ CMD["watch_command"] = K("ps:while($true){{ cls; {command}; Start-Sleep {interval} }}", "sh:timeout 30 watch -n {interval} {command}")
319
+ CMD["docker_run"] = K("cmd:docker run -d {image}", "sh:docker run -d {image}"); CMD["docker_list"] = K("cmd:docker ps -a", "sh:docker ps -a"); CMD["docker_stop"] = K("cmd:docker stop {container}", "sh:docker stop {container}")
320
+ CMD["docker_compose_up"] = K("cmd:docker compose up -d", "sh:docker compose up -d"); CMD["docker_prune"] = K("cmd:docker system prune -af", "sh:docker system prune -af")
321
+ CMD["run_llm"] = K("cmd:ollama run {model}", "sh:ollama run {model} 'Namaste' 2>&1 | head -20"); CMD["list_llm_models"] = K("cmd:ollama list", "sh:ollama list"); CMD["pull_llm_model"] = K("cmd:ollama pull {model}", "sh:ollama pull {model}")
322
+ CMD["stop_llm"] = K("cmd:taskkill /im ollama.exe /f", "sh:ollama stop $(ollama ps | awk 'NR==2{{print $1}}') 2>/dev/null; pkill -f 'ollama runner'"); CMD["run_llm_benchmark"] = K(None, "sh:~/llama.cpp/build/bin/llama-bench -m {model} -t 4")
323
+ CMD["transcribe_audio"] = K("cmd:whisper {file} --language hi", "sh:~/whisper.cpp/build/bin/whisper-cli -m ~/whisper.cpp/models/ggml-base.bin -f {file} -l hi -nt")
324
+ CMD["convert_media"] = K("cmd:ffmpeg -i {file} out.{format_ext}", "sh:ffmpeg -y -i {file} -ar 16000 -ac 1 ~/converted.{format_ext}")
325
+ CMD["build_project"] = K("cmd:cd {path} && cmake -B build && cmake --build build", "sh:cd {path} && cmake -B build && cmake --build build -j4")
326
+ # ------------------------------------------------------------------ GPIO (Pi only) - pinctrl on Bookworm
327
+ CMD["gpio_on"] = K(None, "sh:pinctrl set {gpio} op dh && pinctrl get {gpio}"); CMD["gpio_off"] = K(None, "sh:pinctrl set {gpio} op dl && pinctrl get {gpio}")
328
+ CMD["gpio_toggle"] = K(None, "sh:L=$(pinctrl get {gpio} | grep -o ' hi\\| lo' | tr -d ' '); [ \"$L\" = hi ] && pinctrl set {gpio} op dl || pinctrl set {gpio} op dh; pinctrl get {gpio}")
329
+ CMD["gpio_read"] = K(None, "sh:pinctrl get {gpio}"); CMD["gpio_info"] = K(None, "sh:pinctrl get {gpio}; pinctrl funcs {gpio}")
330
+ CMD["gpio_set_mode"] = K(None, "sh:pinctrl set {gpio} {mode_pc} && pinctrl get {gpio}"); CMD["gpio_set_pull"] = K(None, "sh:pinctrl set {gpio} ip {pull_pc} && pinctrl get {gpio}")
331
+ CMD["gpio_set_alt"] = K(None, "sh:pinctrl set {gpio} {alt} && pinctrl get {gpio}"); CMD["gpio_alt_functions"] = K(None, "sh:pinctrl funcs {gpio}")
332
+ CMD["gpio_reset"] = K(None, "sh:pinctrl set {gpio} ip pn && pinctrl get {gpio}"); CMD["gpio_reset_all"] = K(None, "sh:for p in $(seq 2 27); do pinctrl set $p ip pn; done; pinctrl get 2-27")
333
+ CMD["list_gpio"] = K(None, "sh:pinctrl get 2-27"); CMD["list_free_gpio"] = K(None, "sh:pinctrl get 2-27 | grep -E 'ip|no' | grep -v -E 'a[0-9]'")
334
+ CMD["list_gpio_chips"] = K(None, "sh:gpiodetect 2>/dev/null || ls /dev/gpiochip*"); CMD["show_pinout"] = K(None, "sh:pinout 2>/dev/null || cat /usr/share/doc/python3-gpiozero/pinout.txt 2>/dev/null || echo 'sudo apt install python3-gpiozero'")
335
+ CMD["gpio_pin_role"] = K(None, "py:gpio_pin_role"); CMD["bcm_to_board"] = K(None, "py:bcm_to_board"); CMD["board_to_bcm"] = K(None, "py:board_to_bcm")
336
+ CMD["gpio_pwm"] = K(None, "sh:python3 -c \"from gpiozero import PWMOutputDevice; import time; p=PWMOutputDevice({gpio}, frequency={freq}); p.value={duty}/100; print('pwm {duty}% on gpio {gpio}'); time.sleep(5)\"")
337
+ CMD["gpio_servo"] = K(None, "sh:python3 -c \"from gpiozero import AngularServo; import time; s=AngularServo({gpio}, min_angle=0, max_angle=180); s.angle={angle}; print('servo -> {angle}'); time.sleep(1.5)\"")
338
+ CMD["gpio_blink"] = K(None, "sh:python3 -c \"from gpiozero import LED; import time; l=LED({gpio}); [ (l.on(), time.sleep({interval}/1000), l.off(), time.sleep({interval}/1000)) for _ in range({count}) ]; print('blinked {count}x')\"")
339
+ CMD["gpio_pulse"] = K(None, "sh:pinctrl set {gpio} op dh && sleep {seconds} && pinctrl set {gpio} op dl && echo 'pulse done'")
340
+ CMD["gpio_watch"] = K(None, "sh:timeout 20 gpiomon -e {edge_g} $(gpiodetect | awk 'NR==1{{print $1}}') {gpio} 2>/dev/null || (for i in $(seq 1 20); do pinctrl get {gpio}; sleep 1; done)")
341
+ CMD["gpio_stop_watch"] = K(None, "sh:pkill gpiomon; echo stopped"); CMD["gpio_conflicts"] = K(None, "sh:dtoverlay -l; echo; pinctrl get 2-27 | grep -E 'a[0-9]'")
342
+ CMD["gpio_debug"] = K(None, "sh:echo '== state'; pinctrl get {gpio}; echo '== functions'; pinctrl funcs {gpio}; echo '== overlays'; dtoverlay -l; echo '== chips'; gpiodetect 2>/dev/null; echo '== groups'; groups; echo '== who uses it'; {sudo}lsof /dev/gpiochip* 2>/dev/null | head")
343
+ CMD["gpio_debug_all"] = K(None, "sh:echo '== all pins'; pinctrl get 2-27; echo '== overlays'; dtoverlay -l; echo '== chips'; gpiodetect 2>/dev/null; echo '== groups'; groups; echo '== throttle'; vcgencmd get_throttled")
344
+ CMD["i2c_scan"] = K(None, "sh:i2cdetect -y 1"); CMD["i2c_read"] = K(None, "sh:i2cget -y 1 {address} {register}"); CMD["i2c_write"] = K(None, "sh:i2cset -y 1 {address} {register} {value}"); CMD["i2c_dump"] = K(None, "sh:i2cdump -y 1 {address}")
345
+ CMD["interface_enable"] = K(None, "sh:{sudo}raspi-config nonint do_{iface_rc} 0 && echo 'enabled (reboot may be needed)'"); CMD["interface_disable"] = K(None, "sh:{sudo}raspi-config nonint do_{iface_rc} 1 && echo disabled")
346
+ CMD["open_task_manager"] = K("cmd:taskmgr", None)
executor/executor.py ADDED
@@ -0,0 +1,304 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Union executor: model JSON -> gated, whitelisted OS command.
2
+ plan(cmd, platform) -> Plan (kind, command, note, risk, needs_sudo, supported)
3
+ gate(plan, allow_caution, confirm_text) -> (ok, reason)
4
+ run(plan, dry_run=True) -> {"status": ok|error|timeout|dry_run|skipped, "output": ..., "command": ...}
5
+ The model only produces text; nothing runs unless the catalog knows the action and the gate passes.
6
+ """
7
+ import json, os, re, shlex, subprocess, sys, time, threading, urllib.parse, webbrowser
8
+ HERE = os.path.dirname(os.path.abspath(__file__)); sys.path.insert(0, HERE)
9
+ from commands import CMD # noqa
10
+ import tables as T # noqa
11
+ CATALOG = json.load(open(os.path.join(HERE, "..", "model", "catalog.json")))["actions"]
12
+
13
+ # ---------------------------------------------------------------- static tables
14
+ BCM_TO_BOARD = {2: 3, 3: 5, 4: 7, 14: 8, 15: 10, 17: 11, 18: 12, 27: 13, 22: 15, 23: 16, 24: 18, 10: 19, 9: 21, 25: 22, 11: 23, 8: 24, 7: 26, 0: 27, 1: 28, 5: 29, 6: 31, 12: 32, 13: 33, 19: 35, 16: 36, 26: 37, 20: 38, 21: 40}
15
+ BOARD_TO_BCM = {v: k for k, v in BCM_TO_BOARD.items()}
16
+ BOARD_POWER = {1: "3.3V", 17: "3.3V", 2: "5V", 4: "5V", 6: "GND", 9: "GND", 14: "GND", 20: "GND", 25: "GND", 30: "GND", 34: "GND", 39: "GND"}
17
+ BCM_ROLE = {2: "I2C1 SDA", 3: "I2C1 SCL", 14: "UART TXD", 15: "UART RXD", 18: "PCM CLK / PWM0", 19: "PCM FS / PWM1 / SPI1 MISO", 12: "PWM0", 13: "PWM1", 10: "SPI0 MOSI", 9: "SPI0 MISO", 11: "SPI0 SCLK", 8: "SPI0 CE0", 7: "SPI0 CE1", 0: "ID_SD (EEPROM)", 1: "ID_SC (EEPROM)", 4: "GPCLK0 / 1-Wire default", 20: "PCM DIN / SPI1 MOSI", 21: "PCM DOUT / SPI1 SCLK", 16: "SPI1 CE2", 17: "SPI1 CE1"}
18
+ ROLE_TO_PIN = {"sda": "GPIO2 (board 3)", "scl": "GPIO3 (board 5)", "txd": "GPIO14 (board 8)", "rxd": "GPIO15 (board 10)", "ground": "board 6,9,14,20,25,30,34,39", "gnd": "board 6,9,14,20,25,30,34,39", "3.3v": "board 1,17", "3v3": "board 1,17", "5v": "board 2,4", "pwm": "GPIO12/13/18/19", "mosi": "GPIO10 (board 19)", "miso": "GPIO9 (board 21)", "sclk": "GPIO11 (board 23)", "ce0": "GPIO8 (board 24)", "i2c": "GPIO2 SDA / GPIO3 SCL (board 3/5)", "spi": "GPIO10/9/11/8/7 (board 19/21/23/24/26)", "uart": "GPIO14 TXD / GPIO15 RXD (board 8/10)", "pcm": "GPIO18/19/20/21 (board 12/35/38/40)"}
19
+ POWER_GUID = {"performance": "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c", "balanced": "381b4222-f694-41f0-9685-ff5bb260df2e", "power_saver": "a1841308-3541-4fab-bc81-f71556f20b4a"}
20
+ GOV_FOR_MODE = {"performance": "performance", "balanced": "ondemand", "power_saver": "powersave"}
21
+ TZ_WIN = {"asia/kolkata": "India Standard Time", "utc": "UTC", "asia/dubai": "Arabian Standard Time", "america/new_york": "Eastern Standard Time", "europe/london": "GMT Standard Time", "asia/tokyo": "Tokyo Standard Time", "asia/singapore": "Singapore Standard Time", "australia/sydney": "AUS Eastern Standard Time"}
22
+ VK = dict(T.VK, **{"escape": 0x1B, "esc": 0x1B, "enter": 0x0D, "return": 0x0D, "space": 0x20, "backspace": 0x08, "delete": 0x2E, "del": 0x2E, "home": 0x24, "end": 0x23, "pageup": 0x21, "pagedown": 0x22, "page_down": 0x22, "page_up": 0x21, "period": 0xBE, "n": 0x4E, "r": 0x52, "p": 0x50, "h": 0x48, "printscreen": 0x2C, "f11": 0x7A, "f1": 0x70, "f2": 0x71, "f3": 0x72, "f6": 0x75, "f10": 0x79, "f12": 0x7B})
23
+ XKEY = {"escape": "Escape", "esc": "Escape", "enter": "Return", "return": "Return", "space": "space", "backspace": "BackSpace", "delete": "Delete", "del": "Delete", "home": "Home", "end": "End", "pageup": "Page_Up", "pagedown": "Page_Down", "page_down": "Page_Down", "page_up": "Page_Up", "tab": "Tab", "up": "Up", "down": "Down", "left": "Left", "right": "Right", "f5": "F5", "f11": "F11", "f4": "F4", "period": "period", "plus": "plus", "minus": "minus"}
24
+ CRON = [("every 5 minutes", "*/5 * * * *"), ("every hour", "0 * * * *"), ("har ghante", "0 * * * *"), ("daily", "0 6 * * *"), ("roz subah", "0 6 * * *"), ("at 3 am", "0 3 * * *"), ("on reboot", "@reboot"), ("every monday", "0 9 * * 1"), ("at midnight", "0 0 * * *")]
25
+
26
+ def platform_name():
27
+ return "win" if os.name == "nt" else "pi"
28
+
29
+ def is_root():
30
+ return hasattr(os, "geteuid") and os.geteuid() == 0
31
+
32
+ class Plan:
33
+ def __init__(self, action, kind, command, note="", supported=True, risk="safe", needs_sudo=False, platform="pi", meta=None):
34
+ self.action, self.kind, self.command, self.note = action, kind, command, note
35
+ self.supported, self.risk, self.needs_sudo, self.platform = supported, risk, needs_sudo, platform
36
+ self.meta = meta or {}
37
+ def to_dict(self):
38
+ return {"action": self.action, "kind": self.kind, "command": self.command, "note": self.note, "supported": self.supported,
39
+ "risk": self.risk, "needs_sudo": self.needs_sudo, "platform": self.platform, **self.meta}
40
+
41
+ # ---------------------------------------------------------------- quoting
42
+ def q_sh(v): return shlex.quote(str(v))
43
+ def q_ps(v): return "'" + str(v).replace("'", "''") + "'"
44
+ def q_cmd(v):
45
+ s = str(v).replace('"', "")
46
+ return f'"{s}"' if re.search(r"[\s&|<>^]", s) else s
47
+ QUOTE = {"sh": q_sh, "ps": q_ps, "cmd": q_cmd}
48
+
49
+ def derived(cmd, plat, action):
50
+ """Fill the derived placeholders. Raw slot values are quoted per shell by render()."""
51
+ d = {}
52
+ a, u = cmd.get("amount"), cmd.get("unit")
53
+ secs = (a or 0) * {"sec": 1, "min": 60, "hour": 3600}.get(u, 60) if a is not None else 0
54
+ d["seconds"] = secs; d["minutes"] = max(0, round(secs / 60)) if secs else 0
55
+ d["step"] = cmd.get("step", 10)
56
+ spec = CATALOG[action]
57
+ d["sudo"] = "sudo " if (spec.get("needs_sudo") and plat == "pi" and not is_root()) else ""
58
+ d["home"] = os.path.expanduser("~")
59
+ if "app" in cmd:
60
+ ap = T.APPS.get(cmd["app"], {}); d["app_win"] = ap.get("win") or ""; d["app_pi"] = ap.get("pi") or ""
61
+ d["proc_win"] = T.WIN_PROC.get(cmd["app"]) or cmd["app"]; d["proc_pi"] = T.PI_PROC.get(cmd["app"]) or cmd["app"]
62
+ if "site" in cmd and action != "web_login": d["site_url"] = T.SITES.get(cmd["site"], "https://" + cmd["site"])
63
+ if "url" in cmd: d["url_full"] = cmd["url"] if cmd["url"].startswith(("http://", "https://")) else "https://" + cmd["url"]
64
+ for k in ("query", "subject", "text"):
65
+ if k in cmd: d[k + "_url"] = urllib.parse.quote(str(cmd[k]))
66
+ if "folder" in cmd:
67
+ f = T.FOLDERS.get(cmd["folder"], {}); d["folder_win"] = f.get("win", "%USERPROFILE%"); d["folder_pi"] = f.get("pi", "~")
68
+ d["page_uri"] = T.SETTINGS_PAGES.get(cmd.get("page", ""), "ms-settings:")
69
+ if "service" in cmd: d["svc_unit"] = T.SERVICE_UNITS.get(cmd["service"], cmd["service"]); d["svc_win"] = T.WIN_SERVICES.get(cmd["service"], cmd["service"])
70
+ if "mode" in cmd:
71
+ d["mode_cmd"] = T.DISPLAY_MODES.get(cmd["mode"], "DisplaySwitch.exe /extend"); d["power_guid"] = POWER_GUID.get(cmd["mode"], POWER_GUID["balanced"])
72
+ d["governor_for_mode"] = GOV_FOR_MODE.get(cmd["mode"], "ondemand"); d["mode_pc"] = {"input": "ip", "output": "op"}.get(cmd["mode"], "ip")
73
+ if "pull" in cmd: d["pull_pc"] = {"up": "pu", "down": "pd", "none": "pn"}.get(cmd["pull"], "pn")
74
+ if "edge" in cmd: d["edge_g"] = {"rising": "rising", "falling": "falling", "both": "both"}.get(cmd["edge"], "both")
75
+ else: d["edge_g"] = "both"
76
+ if "pin" in cmd:
77
+ pin = int(cmd["pin"])
78
+ if cmd.get("numbering") == "board": pin = BOARD_TO_BCM.get(pin, -1)
79
+ d["gpio"] = pin
80
+ if "interface" in cmd: d["iface_rc"] = {"i2c": "i2c", "spi": "spi", "serial": "serial_hw", "onewire": "onewire", "camera": "legacy"}.get(cmd["interface"], cmd["interface"])
81
+ if "orientation" in cmd: d["orientation_wl"] = {"landscape": "normal", "portrait": "90", "landscape_flipped": "180"}.get(cmd["orientation"], "normal")
82
+ if "key" in cmd: d["key_x"] = XKEY.get(cmd["key"], cmd["key"])
83
+ if "text" in cmd: d["text_sendkeys"] = q_ps(re.sub(r"([+^%~(){}\[\]])", r"{\1}", str(cmd["text"])))
84
+ if "tz" in cmd: d["tz_win"] = TZ_WIN.get(str(cmd["tz"]).lower(), "UTC")
85
+ if "target" in cmd: d["boot_target"] = "graphical" if cmd["target"] in ("desktop", "graphical") else "multi-user"
86
+ if "priority" in cmd: p = str(cmd["priority"]); d["priority_num"] = {"low": 10, "high": -5}.get(p, p if p.lstrip("-").isdigit() else 5)
87
+ if "schedule" in cmd:
88
+ s = str(cmd["schedule"]).lower(); d["cron_expr"] = next((c for k, c in CRON if k in s), "0 * * * *")
89
+ if "format" in cmd: f = str(cmd["format"]).lower(); d["format_ext"] = "wav" if "wav" in f else "txt" if f == "text" else f.split()[-1]
90
+ if "freq" not in cmd: d["freq"] = 1000
91
+ if "interval" not in cmd: d["interval"] = 500 if action == "gpio_blink" else 2
92
+ if "count" not in cmd: d["count"] = 5
93
+ if "user" not in cmd: d["user"] = "pi"
94
+ if "baud" not in cmd: d["baud"] = 115200
95
+ if "password" not in cmd: d["password"] = ""
96
+ d["pw_arg"] = (" password " + q_sh(cmd["password"])) if cmd.get("password") else ""
97
+ if action == "hotspot_on" and "ssid" not in cmd: d["ssid"] = "PiHotspot"
98
+ return d
99
+
100
+ def render(action, cmd, plat):
101
+ spec = CATALOG.get(action)
102
+ if not spec: return Plan(action, "py", "", "unknown action", supported=False)
103
+ tmpl = CMD.get(action, {}).get(plat)
104
+ risk, sudo = spec["risk"], spec.get("needs_sudo", False)
105
+ plat_name = "windows" if plat == "win" else "pi"
106
+ if plat_name not in spec["platforms"] or not tmpl:
107
+ return Plan(action, "none", "", f"'{action}' is not available on {'Windows' if plat == 'win' else 'Raspberry Pi'}", supported=False, risk=risk, needs_sudo=sudo, platform=plat)
108
+ kind, _, body = tmpl.partition(":")
109
+ quote = QUOTE.get(kind, lambda v: str(v))
110
+ vals = {}
111
+ RAW = {"run_command", "run_script", "run_background", "watch_command", "schedule_task", "create_service"}
112
+ for k, v in cmd.items():
113
+ if k == "action": continue
114
+ raw = isinstance(v, int) or kind in ("open", "key", "py") or (k == "command" and action in RAW)
115
+ vals[k] = v if raw else quote(v)
116
+ d = derived(cmd, plat, action)
117
+ for k, v in d.items():
118
+ if k not in vals: vals[k] = quote(v) if k == "password" else v
119
+ if "pin" in cmd and kind != "py":
120
+ g = d.get("gpio", -1)
121
+ if cmd.get("numbering") == "board" and int(cmd["pin"]) in BOARD_POWER:
122
+ return Plan(action, kind, "", f"physical pin {cmd['pin']} is a {BOARD_POWER[int(cmd['pin'])]} pin, not a GPIO - refused", supported=False, risk=risk, needs_sudo=sudo, platform=plat)
123
+ if not (isinstance(g, int) and 0 <= g <= 27):
124
+ return Plan(action, kind, "", f"pin {cmd['pin']} ({cmd.get('numbering', 'bcm')}) is not a usable GPIO (BCM 0-27) - refused", supported=False, risk=risk, needs_sudo=sudo, platform=plat)
125
+ try:
126
+ command = body.format(**vals)
127
+ except KeyError as e:
128
+ return Plan(action, kind, body, f"missing value for {e}", supported=False, risk=risk, needs_sudo=sudo, platform=plat)
129
+ note = spec.get("desc", "")
130
+ if kind == "sh" and d.get("sudo") and "sudo" not in command and sudo: command = "sudo " + command
131
+ return Plan(action, kind, command, note, True, risk, sudo, plat, {"gpio": d.get("gpio")})
132
+
133
+ def plan(cmd, plat=None, text=None):
134
+ """text = the user's original sentence; when given, GPIO writes that name a bare 'pin N' ask board vs BCM."""
135
+ plat = plat or platform_name()
136
+ a = cmd.get("action", "unknown")
137
+ if a == "clarify":
138
+ return Plan("clarify", "py", "", f"need more information for '{cmd.get('action_ref', cmd.get('target', ''))}'".strip(), True, "safe", False, plat)
139
+ bad = suspicious_credentials(cmd) or ambiguous_pin(cmd, text)
140
+ if bad:
141
+ return Plan("clarify", "py", "", bad, True, "safe", False, plat, {"clarify_for": a})
142
+ return render(a, cmd, plat)
143
+
144
+ # 'pin no 11' is labelled board in some training rows and BCM in others, so the model's numbering for a bare pin is a
145
+ # guess. For anything that drives a pin (risk above safe) the user must say which numbering they mean.
146
+ _PIN_QUALIFIER = re.compile(r"\b(gpio|bcm|board|physical|phys|header)", re.I)
147
+
148
+ def ambiguous_pin(cmd, text):
149
+ """Return a clarification message when a pin-driving action came from text with no gpio/bcm/board qualifier, else ''."""
150
+ a = cmd.get("action"); spec = CATALOG.get(a, {})
151
+ if text is None or "pin" not in cmd or "pin" not in spec.get("slots", []) or spec.get("risk") == "safe": return ""
152
+ if _PIN_QUALIFIER.search(text): return ""
153
+ n = int(cmd["pin"]); as_board = BOARD_TO_BCM.get(n); as_bcm = BCM_TO_BOARD.get(n)
154
+ board = f"physical/board pin {n}" + (f" (= GPIO {as_board})" if as_board is not None else " (not a GPIO)")
155
+ bcm = f"GPIO/BCM {n}" + (f" (= board pin {as_bcm})" if as_bcm is not None else " (not on the header)")
156
+ return f"pin {n} is ambiguous: {board} or {bcm}? Say 'board pin {n}' or 'gpio {n}'"
157
+
158
+ # words that are never a real password/ssid on their own: a model slip that copied a filler instead of the value
159
+ _FILLER = {"hai", "hain", "he", "h", "ka", "ki", "ke", "ko", "se", "pe", "par", "aur", "and", "is", "was", "to", "the", "please", "plz",
160
+ "password", "pass", "pwd", "passwd", "key", "naam", "name", "ssid", "wifi", "wi-fi", "network", "uska", "iska", "mera", "mere",
161
+ "ghar", "connect", "karo", "kar", "do", "jodo", "jod", "lagao", "yaar", "abhi", "jaldi", "pehle", "baad", "mein", "phir"}
162
+ # words that should never be inside a network name: seeing one means the model's copy span slipped
163
+ _NOT_IN_SSID = {"hai", "hain", "password", "pass", "pwd", "passwd", "key", "connect", "karo", "kar", "jodo", "ka", "ki", "ke", "se", "ghar", "mere", "naam",
164
+ "pehle", "baad", "mein", "phir"}
165
+ _CRED_ACTIONS = {"connect_wifi", "hotspot_on", "web_login", "forget_wifi", "show_wifi_password"}
166
+
167
+ def suspicious_credentials(cmd):
168
+ """Return a clarification message when the parsed credential slots look like a mis-copy, else ''."""
169
+ a = cmd.get("action")
170
+ if a not in _CRED_ACTIONS: return ""
171
+ name = str(cmd.get("ssid") or cmd.get("username") or "").strip()
172
+ pw = cmd.get("password")
173
+ if pw is not None:
174
+ pws = str(pw).strip(); words = [w.strip(":,.;") for w in re.split(r"\s+", pws.lower())]
175
+ if not pws or all(w in _FILLER for w in words): return f"password looks wrong ('{pws}'), please say the password again"
176
+ if len(words) > 1 and any(w in _FILLER for w in words): return f"password '{pws}' looks like part of the sentence, please say the password again"
177
+ if name and pws.lower() == name.lower(): return "password came out the same as the network/user name, please repeat both"
178
+ if "ssid" in cmd and name:
179
+ words = [w.strip(":,.;") for w in re.split(r"\s+", name.lower())]
180
+ if all(w in _FILLER for w in words) or any(w in _NOT_IN_SSID for w in words):
181
+ return f"network name '{name}' looks wrong, please give the network name (and password) again"
182
+ return ""
183
+
184
+ # ---------------------------------------------------------------- gating
185
+ def gate(p, allow_caution=False, confirm_text=None):
186
+ if not p.supported: return False, p.note
187
+ if p.risk == "critical":
188
+ return (confirm_text == p.action), f"critical action: type the action name '{p.action}' to confirm"
189
+ if p.risk == "caution" and not allow_caution: return False, "caution action: enable 'allow caution actions' or confirm"
190
+ return True, "ok"
191
+
192
+ # ---------------------------------------------------------------- execution
193
+ _timers = {}
194
+ _last = {"plan": None}
195
+ def _open(target):
196
+ try:
197
+ if os.name == "nt": os.startfile(target); return "opened " + target
198
+ r = subprocess.run(["xdg-open", target], capture_output=True, text=True, timeout=10)
199
+ return ("opened " if r.returncode == 0 else "could not open (no desktop session): ") + target
200
+ except Exception as e:
201
+ return f"open failed: {e}"
202
+
203
+ def _key(combo, plat):
204
+ keys = [k.strip().lower() for k in combo.split("+")]
205
+ if plat == "win":
206
+ vks = [VK.get(k) for k in keys]
207
+ if None in vks: return "cmd_fail", f"unknown key in {combo}"
208
+ ps = T.WIN_KEYS + f"[K]::Press([byte[]]@({','.join(hex(v) for v in vks)}))"
209
+ return _shell("ps", ps)
210
+ x = "+".join(XKEY.get(k, k) for k in keys).replace("win+", "super+")
211
+ return _shell("sh", f"xdotool key {x} 2>/dev/null || wtype -k {x.split('+')[-1]}")
212
+
213
+ def _powershell():
214
+ """PATH may not include PowerShell (e.g. started from Git Bash or a Store Python); fall back to the system copy."""
215
+ import shutil
216
+ return shutil.which("powershell") or os.path.join(os.environ.get("SystemRoot", r"C:\Windows"), "System32", "WindowsPowerShell", "v1.0", "powershell.exe")
217
+
218
+ def _shell(kind, command, timeout=25):
219
+ try:
220
+ if kind == "ps":
221
+ exe = _powershell() if os.name == "nt" else "pwsh"
222
+ import base64
223
+ enc = base64.b64encode(("$ProgressPreference='SilentlyContinue'; " + command).encode("utf-16-le")).decode()
224
+ argv = [exe, "-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-EncodedCommand", enc]
225
+ r = subprocess.run(argv, capture_output=True, text=True, timeout=timeout)
226
+ elif kind == "cmd":
227
+ if os.name != "nt": return "unsupported", "cmd.exe command - not runnable on Linux"
228
+ r = subprocess.run(f'cmd.exe /d /s /c "{command}"', capture_output=True, text=True, timeout=timeout, shell=False)
229
+ else:
230
+ if os.name == "nt": return "unsupported", "bash command - not runnable on Windows"
231
+ r = subprocess.run(["bash", "-lc", command], capture_output=True, text=True, timeout=timeout)
232
+ out = (r.stdout + ("\n" + r.stderr if r.stderr.strip() else "")).strip()
233
+ return ("ok" if r.returncode == 0 else "error"), out[-4000:] or f"(exit {r.returncode})"
234
+ except subprocess.TimeoutExpired:
235
+ return "timeout", f"no answer in {timeout}s"
236
+ except FileNotFoundError as e:
237
+ return "error", f"shell not found: {e}"
238
+
239
+ def _builtin(name, cmd, plat):
240
+ if name == "noop": return "ok", "not a device command - nothing done"
241
+ if name == "clarify": return "ok", "asked user for the missing value"
242
+ if name == "help":
243
+ groups = {}
244
+ for a, s in CATALOG.items(): groups.setdefault(s["risk"], []).append(a)
245
+ return "ok", f"{len(CATALOG)} actions. safe: {len(groups.get('safe', []))}, caution: {len(groups.get('caution', []))}, critical: {len(groups.get('critical', []))}. Try: 'volume 60 karo', 'gpio 17 high karo', 'wifi Airtel_5G se connect karo password xyz'"
246
+ if name in ("timer", "reminder"):
247
+ secs = (cmd.get("amount", 0)) * {"sec": 1, "min": 60, "hour": 3600}.get(cmd.get("unit", "min"), 60)
248
+ msg = cmd.get("text", "timer done")
249
+ t = threading.Timer(secs, lambda: print(f"\a[{name}] {msg}")); t.daemon = True; t.start(); _timers[name] = t
250
+ return "ok", f"{name} set for {secs}s" + (f": {msg}" if name == "reminder" else "")
251
+ if name == "cancel_timer":
252
+ t = _timers.pop("timer", None); return "ok", "timer cancelled" if t and not t.cancel() else "no active timer"
253
+ if name == "alarm": return "ok", f"alarm registered for {cmd.get('time')} (in-process; use the OS clock app for persistence)"
254
+ if name == "cancel_alarm": return "ok", "alarm cancelled"
255
+ if name == "stopwatch_start": _timers["sw"] = time.time(); return "ok", "stopwatch started"
256
+ if name == "stopwatch_stop": s = _timers.pop("sw", None); return "ok", f"stopwatch: {time.time() - s:.1f}s" if s else "stopwatch was not running"
257
+ if name == "calculate":
258
+ e = str(cmd.get("expression", "")).lower()
259
+ e = re.sub(r"\bplus\b|\bjod\w*", "+", e); e = re.sub(r"\bminus\b", "-", e); e = re.sub(r"\btimes\b|\binto\b|\bx\b|\bguna\b", "*", e)
260
+ e = re.sub(r"\bdivided by\b|\bbhaag\b", "/", e); e = re.sub(r"(\d+(?:\.\d+)?)\s*(?:ka|of)?\s*(\d+(?:\.\d+)?)\s*percent(?: of)?", r"(\1*\2/100)", e)
261
+ e = re.sub(r"(\d+(?:\.\d+)?)\s*percent of\s*(\d+(?:\.\d+)?)", r"(\1*\2/100)", e); e = re.sub(r"sqrt of\s*(\d+)", r"(\1**0.5)", e)
262
+ e = re.sub(r"(\d+)\s*(?:ki|to the)\s*power\s*(\d+)", r"(\1**\2)", e); e = re.sub(r"(\d+)\s*se\s*(\d+)\s*ghatao", r"(\1-\2)", e)
263
+ if not re.fullmatch(r"[\d\s+\-*/().]+", e): return "error", f"could not parse expression: {cmd.get('expression')}"
264
+ try: return "ok", f"{cmd.get('expression')} = {eval(e, {'__builtins__': {}}, {})}"
265
+ except Exception as ex: return "error", str(ex)
266
+ if name == "gpio_pin_role":
267
+ if "role" in cmd: return "ok", f"{cmd['role']}: {ROLE_TO_PIN.get(str(cmd['role']).lower(), 'not a header role')}"
268
+ pin = int(cmd.get("pin", -1)); board = cmd.get("numbering") == "board"
269
+ if board and pin in BOARD_POWER: return "ok", f"board pin {pin} = {BOARD_POWER[pin]}"
270
+ bcm = BOARD_TO_BCM.get(pin, -1) if board else pin
271
+ return "ok", f"GPIO{bcm} (board {BCM_TO_BOARD.get(bcm, '?')}): {BCM_ROLE.get(bcm, 'general purpose I/O')}"
272
+ if name == "bcm_to_board": p = int(cmd["pin"]); return "ok", f"GPIO{p} is physical pin {BCM_TO_BOARD.get(p, 'n/a (not on header)')}"
273
+ if name == "board_to_bcm":
274
+ p = int(cmd["pin"])
275
+ if p in BOARD_POWER: return "ok", f"board pin {p} is {BOARD_POWER[p]} (not a GPIO)"
276
+ return "ok", f"physical pin {p} is GPIO{BOARD_TO_BCM.get(p, 'n/a')}"
277
+ if name == "web_login":
278
+ site = cmd.get("site", ""); url = site if site.startswith("http") else ("http://" + site if re.match(r"^(localhost|\d+\.\d+)", site) else "https://" + (site if "." in site else site + ".com"))
279
+ msg = _open(url)
280
+ return "ok", f"{msg}; login handler received username='{cmd.get('username')}' (password hidden) - form fill needs the browser-automation add-on"
281
+ if name == "send_message":
282
+ app, text = cmd.get("app", "sms"), urllib.parse.quote(str(cmd.get("text", "")))
283
+ url = {"whatsapp": f"https://web.whatsapp.com/send?text={text}", "telegram": f"tg://msg?text={text}", "sms": f"sms:?body={text}", "teams": "msteams:", "slack": "slack://open", "signal": "signal://"}.get(app, "")
284
+ return "ok", (_open(url) if url else "unknown app") + f" -> to {cmd.get('contact')}: {cmd.get('text')}"
285
+ if name == "find_in_page":
286
+ st, o = _key("ctrl+f", plat)
287
+ if st == "ok": _shell("sh" if plat != "win" else "ps", (f"xdotool type {q_sh(cmd.get('query',''))}" if plat != "win" else f"Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait({q_ps(cmd.get('query',''))})"))
288
+ return st, f"find: {cmd.get('query')} ({o})"
289
+ if name == "repeat_last":
290
+ lp = _last["plan"]
291
+ return ("ok", "repeated: " + lp.command) if lp else ("error", "nothing to repeat")
292
+ return "error", f"unknown builtin {name}"
293
+
294
+ def run(p, cmd=None, dry_run=True):
295
+ if not p.supported: return {"status": "unsupported", "output": p.note, "command": p.command}
296
+ if p.action == "clarify": return {"status": "clarify", "output": "ask the user: " + (p.note or "need more information"), "command": ""}
297
+ if dry_run: return {"status": "dry_run", "output": "not executed (dry run)", "command": p.command}
298
+ cmd = cmd or {}
299
+ if p.kind == "py": st, out = _builtin(p.command or CMD[p.action][p.platform].split(":", 1)[1], cmd, p.platform)
300
+ elif p.kind == "open": st, out = "ok", _open(p.command)
301
+ elif p.kind == "key": st, out = _key(p.command, p.platform)
302
+ else: st, out = _shell(p.kind, p.command)
303
+ if st == "ok" and p.action != "repeat_last": _last["plan"] = p
304
+ return {"status": st, "output": out, "command": p.command}
executor/tables.py ADDED
@@ -0,0 +1,333 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '''Tables reused from laptop-agent (B) plus union extensions. Edit here to add apps / sites / folders / services.'''
2
+
3
+ WIN_AUDIO = r'''Add-Type -TypeDefinition @"
4
+ using System.Runtime.InteropServices;
5
+ [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
6
+ interface IAudioEndpointVolume { int f(); int g(); int h(); int i();
7
+ int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext); int j();
8
+ int GetMasterVolumeLevelScalar(out float pfLevel); int k(); int l(); int m(); int n();
9
+ int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext); int GetMute(out bool pbMute); }
10
+ [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
11
+ interface IMMDevice { int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev); }
12
+ [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
13
+ interface IMMDeviceEnumerator { int f(); int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint); }
14
+ [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
15
+ public class Audio {
16
+ static IAudioEndpointVolume Vol() { var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
17
+ IMMDevice dev = null; Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(0, 1, out dev));
18
+ IAudioEndpointVolume epv = null; var epvid = typeof(IAudioEndpointVolume).GUID;
19
+ Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, 23, 0, out epv)); return epv; }
20
+ public static float Volume { get { float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v; }
21
+ set { Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty)); } }
22
+ public static bool Mute { get { bool m = false; Marshal.ThrowExceptionForHR(Vol().GetMute(out m)); return m; }
23
+ set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); } }
24
+ }
25
+ "@; '''
26
+
27
+ WIN_KEYS = r'''Add-Type -TypeDefinition @"
28
+ using System; using System.Runtime.InteropServices;
29
+ public class K { [DllImport("user32.dll")] public static extern void keybd_event(byte vk, byte scan, int flags, int extra);
30
+ public static void Press(byte[] vks){ foreach(var v in vks) keybd_event(v,0,0,0); Array.Reverse(vks); foreach(var v in vks) keybd_event(v,0,2,0);} }
31
+ "@; '''
32
+
33
+ WIN_BT = r'''Add-Type -AssemblyName System.Runtime.WindowsRuntime
34
+ $asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
35
+ Function Await($t, $rt) { $n = $asTask.MakeGenericMethod($rt).Invoke($null, @($t)); $n.Wait(-1) | Out-Null; $n.Result }
36
+ [Windows.Devices.Radios.Radio,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
37
+ [Windows.Devices.Radios.RadioAccessStatus,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
38
+ Await ([Windows.Devices.Radios.Radio]::RequestAccessAsync()) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null
39
+ $radios = Await ([Windows.Devices.Radios.Radio]::GetRadiosAsync()) ([System.Collections.Generic.IReadOnlyList[Windows.Devices.Radios.Radio]])
40
+ $bt = $radios | ? { $_.Kind -eq 'Bluetooth' }
41
+ [Windows.Devices.Radios.RadioState,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
42
+ Await ($bt.SetStateAsync('STATE')) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null'''
43
+
44
+ WIN_SCREENSHOT = r'''Add-Type -AssemblyName System.Windows.Forms,System.Drawing;
45
+ $b=[System.Windows.Forms.SystemInformation]::VirtualScreen; $bmp=New-Object System.Drawing.Bitmap $b.Width,$b.Height;
46
+ $g=[System.Drawing.Graphics]::FromImage($bmp); $g.CopyFromScreen($b.Left,$b.Top,0,0,$bmp.Size);
47
+ $p="$env:USERPROFILE\Pictures\screenshot_$(Get-Date -f yyyyMMdd_HHmmss).png"; $bmp.Save($p); "saved $p"'''
48
+
49
+ VK = {"ctrl": 0x11, "alt": 0x12, "shift": 0x10, "win": 0x5B, "tab": 0x09, "f4": 0x73, "f5": 0x74, "up": 0x26, "down": 0x28,
50
+ "left": 0x25, "right": 0x27, "plus": 0xBB, "minus": 0xBD, "0": 0x30, "a": 0x41, "c": 0x43, "d": 0x44, "s": 0x53,
51
+ "t": 0x54, "v": 0x56, "w": 0x57, "x": 0x58, "y": 0x59, "z": 0x5A, "media_play_pause": 0xB3, "media_next": 0xB0,
52
+ "media_prev": 0xB1, "vol_up": 0xAF, "vol_down": 0xAE, "vol_mute": 0xAD}
53
+
54
+ XDO = {"ctrl": "ctrl", "alt": "alt", "shift": "shift", "super": "super", "win": "super", "tab": "Tab", "f4": "F4", "f5": "F5",
55
+ "up": "Up", "down": "Down", "left": "Left", "right": "Right", "plus": "plus", "minus": "minus", "h": "h", "d": "d"}
56
+
57
+ WIN_PROC = {"chrome": "chrome.exe", "firefox": "firefox.exe", "edge": "msedge.exe", "notepad": "notepad.exe",
58
+ "calculator": "CalculatorApp.exe", "paint": "mspaint.exe", "word": "WINWORD.EXE", "excel": "EXCEL.EXE",
59
+ "powerpoint": "POWERPNT.EXE", "outlook": "OUTLOOK.EXE", "teams": "ms-teams.exe", "vscode": "Code.exe",
60
+ "terminal": "WindowsTerminal.exe", "cmd": "cmd.exe", "powershell": "powershell.exe", "file_explorer": None,
61
+ "task_manager": "Taskmgr.exe", "control_panel": None, "spotify": "Spotify.exe", "vlc": "vlc.exe",
62
+ "media_player": "wmplayer.exe", "whatsapp": "WhatsApp.exe", "telegram": "Telegram.exe", "zoom": "Zoom.exe",
63
+ "discord": "Discord.exe", "slack": "slack.exe", "camera": "WindowsCamera.exe", "photos": "Photos.exe",
64
+ "calendar": "HxOutlook.exe", "clock": "Time.exe", "snipping_tool": "SnippingTool.exe", "store": "WinStore.App.exe",
65
+ "obs": "obs64.exe", "steam": "steam.exe", "onenote": "ONENOTE.EXE", "sticky_notes": "Microsoft.Notes.exe"}
66
+
67
+ PI_PROC = {"chrome": "chromium", "chromium": "chromium", "firefox": "firefox", "notepad": "mousepad", "calculator": "galculator",
68
+ "word": "soffice", "excel": "soffice", "powerpoint": "soffice", "vscode": "code", "terminal": "lxterminal",
69
+ "cmd": "lxterminal", "file_explorer": "pcmanfm", "task_manager": "lxtask", "vlc": "vlc", "media_player": "vlc",
70
+ "telegram": "telegram-desktop", "camera": "rpicam-hello", "photos": "gpicview", "obs": "obs", "thonny": "thonny"}
71
+
72
+ APPS = {
73
+ "chrome": {
74
+ "win": "start chrome",
75
+ "pi": "chromium-browser &"
76
+ },
77
+ "firefox": {
78
+ "win": "start firefox",
79
+ "pi": "firefox &"
80
+ },
81
+ "edge": {
82
+ "win": "start msedge",
83
+ "pi": None
84
+ },
85
+ "chromium": {
86
+ "win": None,
87
+ "pi": "chromium-browser &"
88
+ },
89
+ "notepad": {
90
+ "win": "notepad",
91
+ "pi": "mousepad &"
92
+ },
93
+ "calculator": {
94
+ "win": "calc",
95
+ "pi": "galculator &"
96
+ },
97
+ "paint": {
98
+ "win": "start mspaint",
99
+ "pi": None
100
+ },
101
+ "word": {
102
+ "win": "start winword",
103
+ "pi": "libreoffice --writer &"
104
+ },
105
+ "excel": {
106
+ "win": "start excel",
107
+ "pi": "libreoffice --calc &"
108
+ },
109
+ "powerpoint": {
110
+ "win": "start powerpnt",
111
+ "pi": "libreoffice --impress &"
112
+ },
113
+ "outlook": {
114
+ "win": "start outlook",
115
+ "pi": None
116
+ },
117
+ "teams": {
118
+ "win": "start msteams:",
119
+ "pi": None
120
+ },
121
+ "vscode": {
122
+ "win": "code",
123
+ "pi": "code &"
124
+ },
125
+ "terminal": {
126
+ "win": "start wt || start cmd",
127
+ "pi": "x-terminal-emulator &"
128
+ },
129
+ "cmd": {
130
+ "win": "start cmd",
131
+ "pi": "lxterminal &"
132
+ },
133
+ "powershell": {
134
+ "win": "start powershell",
135
+ "pi": None
136
+ },
137
+ "file_explorer": {
138
+ "win": "explorer.exe",
139
+ "pi": "xdg-open ~ &"
140
+ },
141
+ "task_manager": {
142
+ "win": "taskmgr",
143
+ "pi": "x-terminal-emulator -e htop &"
144
+ },
145
+ "control_panel": {
146
+ "win": "start control",
147
+ "pi": None
148
+ },
149
+ "spotify": {
150
+ "win": "start spotify:",
151
+ "pi": None
152
+ },
153
+ "vlc": {
154
+ "win": "start vlc",
155
+ "pi": "vlc &"
156
+ },
157
+ "media_player": {
158
+ "win": "start wmplayer",
159
+ "pi": "vlc &"
160
+ },
161
+ "whatsapp": {
162
+ "win": "start whatsapp:",
163
+ "pi": None
164
+ },
165
+ "telegram": {
166
+ "win": "start tg:",
167
+ "pi": "telegram-desktop &"
168
+ },
169
+ "zoom": {
170
+ "win": "start zoommtg:",
171
+ "pi": None
172
+ },
173
+ "discord": {
174
+ "win": "start discord:",
175
+ "pi": None
176
+ },
177
+ "slack": {
178
+ "win": "start slack:",
179
+ "pi": None
180
+ },
181
+ "camera": {
182
+ "win": "start microsoft.windows.camera:",
183
+ "pi": "rpicam-hello -t 0 &"
184
+ },
185
+ "photos": {
186
+ "win": "start ms-photos:",
187
+ "pi": "gpicview &"
188
+ },
189
+ "calendar": {
190
+ "win": "start outlookcal:",
191
+ "pi": None
192
+ },
193
+ "clock": {
194
+ "win": "start ms-clock:",
195
+ "pi": None
196
+ },
197
+ "snipping_tool": {
198
+ "win": "start ms-screenclip:",
199
+ "pi": None
200
+ },
201
+ "store": {
202
+ "win": "start ms-windows-store:",
203
+ "pi": None
204
+ },
205
+ "obs": {
206
+ "win": "start obs64",
207
+ "pi": "obs &"
208
+ },
209
+ "steam": {
210
+ "win": "start steam:",
211
+ "pi": None
212
+ },
213
+ "onenote": {
214
+ "win": "start onenote:",
215
+ "pi": None
216
+ },
217
+ "thonny": {
218
+ "win": None,
219
+ "pi": "thonny &"
220
+ },
221
+ "sticky_notes": {
222
+ "win": "start ms-stickynotes:",
223
+ "pi": None
224
+ },
225
+ "browser": {
226
+ "win": "start msedge",
227
+ "pi": "chromium-browser &"
228
+ },
229
+ "disk_management": {
230
+ "win": "diskmgmt.msc",
231
+ "pi": "gparted &"
232
+ },
233
+ "signal": {
234
+ "win": "start signal://",
235
+ "pi": "signal-desktop &"
236
+ },
237
+ "sms": {
238
+ "win": None,
239
+ "pi": None
240
+ }
241
+ }
242
+
243
+ SITES = {
244
+ "youtube": "https://www.youtube.com",
245
+ "google": "https://www.google.com",
246
+ "gmail": "https://mail.google.com",
247
+ "facebook": "https://www.facebook.com",
248
+ "instagram": "https://www.instagram.com",
249
+ "twitter": "https://x.com",
250
+ "linkedin": "https://www.linkedin.com",
251
+ "github": "https://github.com",
252
+ "wikipedia": "https://www.wikipedia.org",
253
+ "amazon": "https://www.amazon.in",
254
+ "flipkart": "https://www.flipkart.com",
255
+ "netflix": "https://www.netflix.com",
256
+ "hotstar": "https://www.hotstar.com",
257
+ "chatgpt": "https://chatgpt.com",
258
+ "claude": "https://claude.ai",
259
+ "whatsapp_web": "https://web.whatsapp.com",
260
+ "stackoverflow": "https://stackoverflow.com",
261
+ "google_maps": "https://maps.google.com",
262
+ "google_drive": "https://drive.google.com",
263
+ "irctc": "https://www.irctc.co.in"
264
+ }
265
+
266
+ FOLDERS = {
267
+ "downloads": {
268
+ "win": "$env:USERPROFILE\\Downloads",
269
+ "pi": "~/Downloads"
270
+ },
271
+ "documents": {
272
+ "win": "$env:USERPROFILE\\Documents",
273
+ "pi": "~/Documents"
274
+ },
275
+ "desktop": {
276
+ "win": "$env:USERPROFILE\\Desktop",
277
+ "pi": "~/Desktop"
278
+ },
279
+ "pictures": {
280
+ "win": "$env:USERPROFILE\\Pictures",
281
+ "pi": "~/Pictures"
282
+ },
283
+ "music": {
284
+ "win": "$env:USERPROFILE\\Music",
285
+ "pi": "~/Music"
286
+ },
287
+ "videos": {
288
+ "win": "$env:USERPROFILE\\Videos",
289
+ "pi": "~/Videos"
290
+ },
291
+ "home": {
292
+ "win": "$env:USERPROFILE",
293
+ "pi": "~"
294
+ },
295
+ "c_drive": {
296
+ "win": "C:\\",
297
+ "pi": "/"
298
+ },
299
+ "d_drive": {
300
+ "win": "D:\\",
301
+ "pi": "/mnt"
302
+ }
303
+ }
304
+
305
+ SETTINGS_PAGES = {
306
+ "display": "ms-settings:display",
307
+ "sound": "ms-settings:sound",
308
+ "bluetooth": "ms-settings:bluetooth",
309
+ "wifi": "ms-settings:network-wifi",
310
+ "network": "ms-settings:network",
311
+ "battery": "ms-settings:batterysaver",
312
+ "power": "ms-settings:powersleep",
313
+ "update": "ms-settings:windowsupdate",
314
+ "apps": "ms-settings:appsfeatures",
315
+ "privacy": "ms-settings:privacy",
316
+ "notifications": "ms-settings:notifications",
317
+ "personalization": "ms-settings:personalization",
318
+ "date_time": "ms-settings:dateandtime",
319
+ "language": "ms-settings:regionlanguage",
320
+ "keyboard": "ms-settings:typing",
321
+ "mouse": "ms-settings:mousetouchpad",
322
+ "storage": "ms-settings:storagesense",
323
+ "accounts": "ms-settings:yourinfo",
324
+ "about": "ms-settings:about",
325
+ "default_apps": "ms-settings:defaultapps",
326
+ "printers": "ms-settings:printers"
327
+ }
328
+
329
+ SERVICE_UNITS = {"ssh": "ssh", "vnc": "vncserver-x11-serviced", "apache": "apache2", "nginx": "nginx", "docker": "docker", "bluetooth": "bluetooth", "cron": "cron", "mysql": "mariadb", "samba": "smbd", "mosquitto": "mosquitto", "nodered": "nodered", "pihole": "pihole-FTL", "spooler": "cups", "w32time": "systemd-timesyncd", "sshd": "ssh"}
330
+
331
+ WIN_SERVICES = {"spooler": "Spooler", "w32time": "W32Time", "ssh": "sshd", "docker": "com.docker.service", "mysql": "MySQL", "apache": "Apache2.4", "nginx": "nginx", "bluetooth": "bthserv", "cron": "Schedule", "vnc": "tvnserver", "samba": "LanmanServer", "mosquitto": "mosquitto", "nodered": "nodered", "pihole": "pihole"}
332
+
333
+ DISPLAY_MODES = {"pc_only": "DisplaySwitch.exe /internal", "duplicate": "DisplaySwitch.exe /clone", "extend": "DisplaySwitch.exe /extend", "second_only": "DisplaySwitch.exe /external"}
model/catalog.json ADDED
@@ -0,0 +1,5539 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "actions": {
3
+ "add_persistent_mount": {
4
+ "slots": [
5
+ "device"
6
+ ],
7
+ "optional": [],
8
+ "risk": "caution",
9
+ "needs_sudo": true,
10
+ "platforms": [
11
+ "pi",
12
+ "windows"
13
+ ],
14
+ "desc": "Add an fstab mount",
15
+ "executable": true
16
+ },
17
+ "airplane_mode_off": {
18
+ "slots": [],
19
+ "optional": [],
20
+ "risk": "safe",
21
+ "needs_sudo": false,
22
+ "platforms": [
23
+ "pi",
24
+ "windows"
25
+ ],
26
+ "desc": "Airplane mode off",
27
+ "executable": true
28
+ },
29
+ "airplane_mode_on": {
30
+ "slots": [],
31
+ "optional": [],
32
+ "risk": "caution",
33
+ "needs_sudo": false,
34
+ "platforms": [
35
+ "pi",
36
+ "windows"
37
+ ],
38
+ "desc": "Airplane mode on (all radios off)",
39
+ "executable": true
40
+ },
41
+ "antivirus_scan": {
42
+ "slots": [],
43
+ "optional": [],
44
+ "risk": "caution",
45
+ "needs_sudo": false,
46
+ "platforms": [
47
+ "pi",
48
+ "windows"
49
+ ],
50
+ "desc": "Run a quick antivirus scan",
51
+ "executable": true
52
+ },
53
+ "attach_session": {
54
+ "slots": [
55
+ "name"
56
+ ],
57
+ "optional": [],
58
+ "risk": "safe",
59
+ "needs_sudo": false,
60
+ "platforms": [
61
+ "pi",
62
+ "windows"
63
+ ],
64
+ "desc": "Attach to a session",
65
+ "executable": true
66
+ },
67
+ "backup_disk_image": {
68
+ "slots": [
69
+ "device"
70
+ ],
71
+ "optional": [],
72
+ "risk": "critical",
73
+ "needs_sudo": true,
74
+ "platforms": [
75
+ "pi",
76
+ "windows"
77
+ ],
78
+ "desc": "Image-backup a disk",
79
+ "executable": true
80
+ },
81
+ "battery_saver_off": {
82
+ "slots": [],
83
+ "optional": [],
84
+ "risk": "safe",
85
+ "needs_sudo": false,
86
+ "platforms": [
87
+ "pi",
88
+ "windows"
89
+ ],
90
+ "desc": "Turn off battery saver",
91
+ "executable": true
92
+ },
93
+ "battery_saver_on": {
94
+ "slots": [],
95
+ "optional": [],
96
+ "risk": "safe",
97
+ "needs_sudo": false,
98
+ "platforms": [
99
+ "pi",
100
+ "windows"
101
+ ],
102
+ "desc": "Turn on battery saver",
103
+ "executable": true
104
+ },
105
+ "bcm_to_board": {
106
+ "slots": [
107
+ "pin"
108
+ ],
109
+ "optional": [],
110
+ "risk": "safe",
111
+ "needs_sudo": false,
112
+ "platforms": [
113
+ "pi"
114
+ ],
115
+ "desc": "Convert BCM GPIO number to physical header pin",
116
+ "executable": true
117
+ },
118
+ "bluetooth_connect": {
119
+ "slots": [
120
+ "device"
121
+ ],
122
+ "optional": [],
123
+ "risk": "safe",
124
+ "needs_sudo": false,
125
+ "platforms": [
126
+ "pi",
127
+ "windows"
128
+ ],
129
+ "desc": "Connect a paired Bluetooth device",
130
+ "executable": true
131
+ },
132
+ "bluetooth_off": {
133
+ "slots": [],
134
+ "optional": [],
135
+ "risk": "caution",
136
+ "needs_sudo": false,
137
+ "platforms": [
138
+ "pi",
139
+ "windows"
140
+ ],
141
+ "desc": "Turn Bluetooth off",
142
+ "executable": true
143
+ },
144
+ "bluetooth_on": {
145
+ "slots": [],
146
+ "optional": [],
147
+ "risk": "caution",
148
+ "needs_sudo": false,
149
+ "platforms": [
150
+ "pi",
151
+ "windows"
152
+ ],
153
+ "desc": "Turn Bluetooth on",
154
+ "executable": true
155
+ },
156
+ "board_to_bcm": {
157
+ "slots": [
158
+ "pin",
159
+ "numbering"
160
+ ],
161
+ "optional": [],
162
+ "risk": "safe",
163
+ "needs_sudo": false,
164
+ "platforms": [
165
+ "pi"
166
+ ],
167
+ "desc": "Convert physical header pin to BCM GPIO number",
168
+ "executable": true
169
+ },
170
+ "bookmark_page": {
171
+ "slots": [],
172
+ "optional": [],
173
+ "risk": "safe",
174
+ "needs_sudo": false,
175
+ "platforms": [
176
+ "pi",
177
+ "windows"
178
+ ],
179
+ "desc": "Bookmark current page",
180
+ "executable": true
181
+ },
182
+ "brightness_down": {
183
+ "slots": [],
184
+ "optional": [
185
+ "step"
186
+ ],
187
+ "risk": "safe",
188
+ "needs_sudo": false,
189
+ "platforms": [
190
+ "pi",
191
+ "windows"
192
+ ],
193
+ "desc": "Decrease brightness (default step 10)",
194
+ "executable": true
195
+ },
196
+ "brightness_up": {
197
+ "slots": [],
198
+ "optional": [
199
+ "step"
200
+ ],
201
+ "risk": "safe",
202
+ "needs_sudo": false,
203
+ "platforms": [
204
+ "pi",
205
+ "windows"
206
+ ],
207
+ "desc": "Increase brightness (default step 10)",
208
+ "executable": true
209
+ },
210
+ "browser_back": {
211
+ "slots": [],
212
+ "optional": [],
213
+ "risk": "safe",
214
+ "needs_sudo": false,
215
+ "platforms": [
216
+ "pi",
217
+ "windows"
218
+ ],
219
+ "desc": "Browser back",
220
+ "executable": true
221
+ },
222
+ "browser_forward": {
223
+ "slots": [],
224
+ "optional": [],
225
+ "risk": "safe",
226
+ "needs_sudo": false,
227
+ "platforms": [
228
+ "pi",
229
+ "windows"
230
+ ],
231
+ "desc": "Browser forward",
232
+ "executable": true
233
+ },
234
+ "build_project": {
235
+ "slots": [
236
+ "path"
237
+ ],
238
+ "optional": [],
239
+ "risk": "caution",
240
+ "needs_sudo": false,
241
+ "platforms": [
242
+ "pi",
243
+ "windows"
244
+ ],
245
+ "desc": "Build/compile a project",
246
+ "executable": true
247
+ },
248
+ "calculate": {
249
+ "slots": [
250
+ "expression"
251
+ ],
252
+ "optional": [],
253
+ "risk": "safe",
254
+ "needs_sudo": false,
255
+ "platforms": [
256
+ "pi",
257
+ "windows"
258
+ ],
259
+ "desc": "Evaluate an arithmetic expression",
260
+ "executable": true
261
+ },
262
+ "camera_photo": {
263
+ "slots": [],
264
+ "optional": [],
265
+ "risk": "safe",
266
+ "needs_sudo": false,
267
+ "platforms": [
268
+ "pi",
269
+ "windows"
270
+ ],
271
+ "desc": "Take a photo with the camera",
272
+ "executable": true
273
+ },
274
+ "camera_video": {
275
+ "slots": [
276
+ "amount",
277
+ "unit"
278
+ ],
279
+ "optional": [],
280
+ "risk": "safe",
281
+ "needs_sudo": false,
282
+ "platforms": [
283
+ "pi"
284
+ ],
285
+ "desc": "Record video for a duration",
286
+ "executable": true
287
+ },
288
+ "cancel_alarm": {
289
+ "slots": [],
290
+ "optional": [],
291
+ "risk": "safe",
292
+ "needs_sudo": false,
293
+ "platforms": [
294
+ "pi",
295
+ "windows"
296
+ ],
297
+ "desc": "Cancel alarm",
298
+ "executable": true
299
+ },
300
+ "cancel_shutdown": {
301
+ "slots": [],
302
+ "optional": [],
303
+ "risk": "caution",
304
+ "needs_sudo": false,
305
+ "platforms": [
306
+ "pi",
307
+ "windows"
308
+ ],
309
+ "desc": "Cancel a scheduled shutdown/restart",
310
+ "executable": true
311
+ },
312
+ "cancel_timer": {
313
+ "slots": [],
314
+ "optional": [],
315
+ "risk": "safe",
316
+ "needs_sudo": false,
317
+ "platforms": [
318
+ "pi",
319
+ "windows"
320
+ ],
321
+ "desc": "Cancel timer",
322
+ "executable": true
323
+ },
324
+ "check_ai_accelerator": {
325
+ "slots": [],
326
+ "optional": [],
327
+ "risk": "safe",
328
+ "needs_sudo": false,
329
+ "platforms": [
330
+ "pi"
331
+ ],
332
+ "desc": "Detect AI HAT / Hailo NPU",
333
+ "executable": true
334
+ },
335
+ "check_filesystem": {
336
+ "slots": [
337
+ "device"
338
+ ],
339
+ "optional": [],
340
+ "risk": "critical",
341
+ "needs_sudo": true,
342
+ "platforms": [
343
+ "pi",
344
+ "windows"
345
+ ],
346
+ "desc": "fsck a filesystem",
347
+ "executable": true
348
+ },
349
+ "check_port": {
350
+ "slots": [
351
+ "host",
352
+ "port"
353
+ ],
354
+ "optional": [],
355
+ "risk": "safe",
356
+ "needs_sudo": false,
357
+ "platforms": [
358
+ "pi",
359
+ "windows"
360
+ ],
361
+ "desc": "Check if a TCP port is open on a host",
362
+ "executable": true
363
+ },
364
+ "check_updates": {
365
+ "slots": [],
366
+ "optional": [],
367
+ "risk": "safe",
368
+ "needs_sudo": false,
369
+ "platforms": [
370
+ "pi",
371
+ "windows"
372
+ ],
373
+ "desc": "Check for OS updates",
374
+ "executable": true
375
+ },
376
+ "clarify": {
377
+ "slots": [],
378
+ "optional": [
379
+ "action"
380
+ ],
381
+ "risk": "safe",
382
+ "needs_sudo": false,
383
+ "platforms": [
384
+ "pi",
385
+ "windows"
386
+ ],
387
+ "desc": "Recognised request but a required value is missing/invalid or the target is ambiguous; ask the user",
388
+ "executable": true
389
+ },
390
+ "clear_notifications": {
391
+ "slots": [],
392
+ "optional": [],
393
+ "risk": "safe",
394
+ "needs_sudo": false,
395
+ "platforms": [
396
+ "pi",
397
+ "windows"
398
+ ],
399
+ "desc": "Clear notifications",
400
+ "executable": true
401
+ },
402
+ "clear_temp_files": {
403
+ "slots": [],
404
+ "optional": [],
405
+ "risk": "critical",
406
+ "needs_sudo": false,
407
+ "platforms": [
408
+ "pi",
409
+ "windows"
410
+ ],
411
+ "desc": "Delete temporary files",
412
+ "executable": true
413
+ },
414
+ "clipboard_history": {
415
+ "slots": [],
416
+ "optional": [],
417
+ "risk": "safe",
418
+ "needs_sudo": false,
419
+ "platforms": [
420
+ "pi",
421
+ "windows"
422
+ ],
423
+ "desc": "Open clipboard history",
424
+ "executable": true
425
+ },
426
+ "clone_disk": {
427
+ "slots": [
428
+ "device"
429
+ ],
430
+ "optional": [],
431
+ "risk": "critical",
432
+ "needs_sudo": true,
433
+ "platforms": [
434
+ "pi",
435
+ "windows"
436
+ ],
437
+ "desc": "Clone the system to another disk",
438
+ "executable": true
439
+ },
440
+ "close_app": {
441
+ "slots": [
442
+ "app"
443
+ ],
444
+ "optional": [],
445
+ "risk": "caution",
446
+ "needs_sudo": false,
447
+ "platforms": [
448
+ "pi",
449
+ "windows"
450
+ ],
451
+ "desc": "Close an application (may lose unsaved work)",
452
+ "executable": true
453
+ },
454
+ "close_tab": {
455
+ "slots": [],
456
+ "optional": [],
457
+ "risk": "safe",
458
+ "needs_sudo": false,
459
+ "platforms": [
460
+ "pi",
461
+ "windows"
462
+ ],
463
+ "desc": "Close current tab",
464
+ "executable": true
465
+ },
466
+ "close_window": {
467
+ "slots": [],
468
+ "optional": [],
469
+ "risk": "caution",
470
+ "needs_sudo": false,
471
+ "platforms": [
472
+ "pi",
473
+ "windows"
474
+ ],
475
+ "desc": "Close current window (Alt+F4)",
476
+ "executable": true
477
+ },
478
+ "compress_file": {
479
+ "slots": [
480
+ "path"
481
+ ],
482
+ "optional": [],
483
+ "risk": "safe",
484
+ "needs_sudo": false,
485
+ "platforms": [
486
+ "pi",
487
+ "windows"
488
+ ],
489
+ "desc": "Zip a file/folder",
490
+ "executable": true
491
+ },
492
+ "connect_wifi": {
493
+ "slots": [
494
+ "ssid"
495
+ ],
496
+ "optional": [
497
+ "password"
498
+ ],
499
+ "risk": "caution",
500
+ "needs_sudo": false,
501
+ "platforms": [
502
+ "pi",
503
+ "windows"
504
+ ],
505
+ "desc": "Connect to a Wi-Fi network (optional password)",
506
+ "executable": true
507
+ },
508
+ "convert_media": {
509
+ "slots": [
510
+ "file",
511
+ "format"
512
+ ],
513
+ "optional": [],
514
+ "risk": "caution",
515
+ "needs_sudo": false,
516
+ "platforms": [
517
+ "pi",
518
+ "windows"
519
+ ],
520
+ "desc": "Convert/transcode media",
521
+ "executable": true
522
+ },
523
+ "copy": {
524
+ "slots": [],
525
+ "optional": [],
526
+ "risk": "safe",
527
+ "needs_sudo": false,
528
+ "platforms": [
529
+ "pi",
530
+ "windows"
531
+ ],
532
+ "desc": "Copy (Ctrl+C)",
533
+ "executable": true
534
+ },
535
+ "copy_file": {
536
+ "slots": [
537
+ "src",
538
+ "dst"
539
+ ],
540
+ "optional": [],
541
+ "risk": "caution",
542
+ "needs_sudo": false,
543
+ "platforms": [
544
+ "pi",
545
+ "windows"
546
+ ],
547
+ "desc": "copy file \"{src}\" to \"{dst}\"",
548
+ "executable": true
549
+ },
550
+ "copy_ssh_key": {
551
+ "slots": [
552
+ "host"
553
+ ],
554
+ "optional": [],
555
+ "risk": "caution",
556
+ "needs_sudo": false,
557
+ "platforms": [
558
+ "pi",
559
+ "windows"
560
+ ],
561
+ "desc": "Install SSH key on a host",
562
+ "executable": true
563
+ },
564
+ "create_calendar_event": {
565
+ "slots": [
566
+ "title",
567
+ "time"
568
+ ],
569
+ "optional": [],
570
+ "risk": "safe",
571
+ "needs_sudo": false,
572
+ "platforms": [
573
+ "pi",
574
+ "windows"
575
+ ],
576
+ "desc": "Create a calendar event",
577
+ "executable": true
578
+ },
579
+ "create_file": {
580
+ "slots": [
581
+ "path"
582
+ ],
583
+ "optional": [],
584
+ "risk": "caution",
585
+ "needs_sudo": false,
586
+ "platforms": [
587
+ "pi",
588
+ "windows"
589
+ ],
590
+ "desc": "create empty file \"{path}\"",
591
+ "executable": true
592
+ },
593
+ "create_folder": {
594
+ "slots": [
595
+ "path"
596
+ ],
597
+ "optional": [],
598
+ "risk": "caution",
599
+ "needs_sudo": false,
600
+ "platforms": [
601
+ "pi",
602
+ "windows"
603
+ ],
604
+ "desc": "Create a new folder on the desktop",
605
+ "executable": true
606
+ },
607
+ "create_service": {
608
+ "slots": [
609
+ "name"
610
+ ],
611
+ "optional": [],
612
+ "risk": "critical",
613
+ "needs_sudo": true,
614
+ "platforms": [
615
+ "pi",
616
+ "windows"
617
+ ],
618
+ "desc": "Create a systemd service",
619
+ "executable": true
620
+ },
621
+ "create_symlink": {
622
+ "slots": [
623
+ "path",
624
+ "link"
625
+ ],
626
+ "optional": [],
627
+ "risk": "caution",
628
+ "needs_sudo": false,
629
+ "platforms": [
630
+ "pi",
631
+ "windows"
632
+ ],
633
+ "desc": "Create a symbolic link",
634
+ "executable": true
635
+ },
636
+ "create_virtualenv": {
637
+ "slots": [
638
+ "path"
639
+ ],
640
+ "optional": [],
641
+ "risk": "caution",
642
+ "needs_sudo": false,
643
+ "platforms": [
644
+ "pi",
645
+ "windows"
646
+ ],
647
+ "desc": "Create a Python virtualenv",
648
+ "executable": true
649
+ },
650
+ "cut": {
651
+ "slots": [],
652
+ "optional": [],
653
+ "risk": "safe",
654
+ "needs_sudo": false,
655
+ "platforms": [
656
+ "pi",
657
+ "windows"
658
+ ],
659
+ "desc": "Cut (Ctrl+X)",
660
+ "executable": true
661
+ },
662
+ "dark_mode_off": {
663
+ "slots": [],
664
+ "optional": [],
665
+ "risk": "safe",
666
+ "needs_sudo": false,
667
+ "platforms": [
668
+ "pi",
669
+ "windows"
670
+ ],
671
+ "desc": "Switch to light theme",
672
+ "executable": true
673
+ },
674
+ "dark_mode_on": {
675
+ "slots": [],
676
+ "optional": [],
677
+ "risk": "safe",
678
+ "needs_sudo": false,
679
+ "platforms": [
680
+ "pi",
681
+ "windows"
682
+ ],
683
+ "desc": "Switch to dark theme",
684
+ "executable": true
685
+ },
686
+ "delete_file": {
687
+ "slots": [
688
+ "path"
689
+ ],
690
+ "optional": [],
691
+ "risk": "critical",
692
+ "needs_sudo": false,
693
+ "platforms": [
694
+ "pi",
695
+ "windows"
696
+ ],
697
+ "desc": "Delete a file/folder by name (to recycle bin on Windows)",
698
+ "executable": true
699
+ },
700
+ "disable_auto_updates": {
701
+ "slots": [],
702
+ "optional": [],
703
+ "risk": "caution",
704
+ "needs_sudo": true,
705
+ "platforms": [
706
+ "pi",
707
+ "windows"
708
+ ],
709
+ "desc": "Disable unattended updates",
710
+ "executable": true
711
+ },
712
+ "discover_devices": {
713
+ "slots": [],
714
+ "optional": [],
715
+ "risk": "safe",
716
+ "needs_sudo": false,
717
+ "platforms": [
718
+ "pi",
719
+ "windows"
720
+ ],
721
+ "desc": "Discover mDNS/LAN devices",
722
+ "executable": true
723
+ },
724
+ "display_mode": {
725
+ "slots": [
726
+ "mode"
727
+ ],
728
+ "optional": [],
729
+ "risk": "safe",
730
+ "needs_sudo": false,
731
+ "platforms": [
732
+ "pi",
733
+ "windows"
734
+ ],
735
+ "desc": "Projection mode: pc_only / duplicate / extend / second_only",
736
+ "executable": true
737
+ },
738
+ "dnd_off": {
739
+ "slots": [],
740
+ "optional": [],
741
+ "risk": "safe",
742
+ "needs_sudo": false,
743
+ "platforms": [
744
+ "pi",
745
+ "windows"
746
+ ],
747
+ "desc": "Do not disturb / focus mode off",
748
+ "executable": true
749
+ },
750
+ "dnd_on": {
751
+ "slots": [],
752
+ "optional": [],
753
+ "risk": "safe",
754
+ "needs_sudo": false,
755
+ "platforms": [
756
+ "pi",
757
+ "windows"
758
+ ],
759
+ "desc": "Do not disturb / focus mode on",
760
+ "executable": true
761
+ },
762
+ "dns_lookup": {
763
+ "slots": [
764
+ "host"
765
+ ],
766
+ "optional": [],
767
+ "risk": "safe",
768
+ "needs_sudo": false,
769
+ "platforms": [
770
+ "pi",
771
+ "windows"
772
+ ],
773
+ "desc": "dns lookup {host}",
774
+ "executable": true
775
+ },
776
+ "docker_compose_up": {
777
+ "slots": [],
778
+ "optional": [],
779
+ "risk": "caution",
780
+ "needs_sudo": false,
781
+ "platforms": [
782
+ "pi",
783
+ "windows"
784
+ ],
785
+ "desc": "Bring up a compose stack",
786
+ "executable": true
787
+ },
788
+ "docker_list": {
789
+ "slots": [],
790
+ "optional": [],
791
+ "risk": "safe",
792
+ "needs_sudo": false,
793
+ "platforms": [
794
+ "pi",
795
+ "windows"
796
+ ],
797
+ "desc": "List containers",
798
+ "executable": true
799
+ },
800
+ "docker_prune": {
801
+ "slots": [],
802
+ "optional": [],
803
+ "risk": "critical",
804
+ "needs_sudo": false,
805
+ "platforms": [
806
+ "pi",
807
+ "windows"
808
+ ],
809
+ "desc": "Prune unused docker data",
810
+ "executable": true
811
+ },
812
+ "docker_run": {
813
+ "slots": [
814
+ "image"
815
+ ],
816
+ "optional": [],
817
+ "risk": "caution",
818
+ "needs_sudo": false,
819
+ "platforms": [
820
+ "pi",
821
+ "windows"
822
+ ],
823
+ "desc": "Run a container from an image",
824
+ "executable": true
825
+ },
826
+ "docker_stop": {
827
+ "slots": [
828
+ "container"
829
+ ],
830
+ "optional": [],
831
+ "risk": "caution",
832
+ "needs_sudo": false,
833
+ "platforms": [
834
+ "pi",
835
+ "windows"
836
+ ],
837
+ "desc": "Stop a container",
838
+ "executable": true
839
+ },
840
+ "download_file": {
841
+ "slots": [
842
+ "url"
843
+ ],
844
+ "optional": [],
845
+ "risk": "caution",
846
+ "needs_sudo": false,
847
+ "platforms": [
848
+ "pi",
849
+ "windows"
850
+ ],
851
+ "desc": "Download a file from a URL",
852
+ "executable": true
853
+ },
854
+ "drop_caches": {
855
+ "slots": [],
856
+ "optional": [],
857
+ "risk": "critical",
858
+ "needs_sudo": true,
859
+ "platforms": [
860
+ "pi",
861
+ "windows"
862
+ ],
863
+ "desc": "Drop page caches",
864
+ "executable": true
865
+ },
866
+ "edit_system_config": {
867
+ "slots": [],
868
+ "optional": [
869
+ "file"
870
+ ],
871
+ "risk": "critical",
872
+ "needs_sudo": true,
873
+ "platforms": [
874
+ "pi",
875
+ "windows"
876
+ ],
877
+ "desc": "Edit a system/boot config file",
878
+ "executable": true
879
+ },
880
+ "emoji_panel": {
881
+ "slots": [],
882
+ "optional": [],
883
+ "risk": "safe",
884
+ "needs_sudo": false,
885
+ "platforms": [
886
+ "pi",
887
+ "windows"
888
+ ],
889
+ "desc": "Open emoji panel",
890
+ "executable": true
891
+ },
892
+ "empty_recycle_bin": {
893
+ "slots": [],
894
+ "optional": [],
895
+ "risk": "critical",
896
+ "needs_sudo": false,
897
+ "platforms": [
898
+ "pi",
899
+ "windows"
900
+ ],
901
+ "desc": "Permanently empty recycle bin / trash",
902
+ "executable": true
903
+ },
904
+ "enable_auto_updates": {
905
+ "slots": [],
906
+ "optional": [],
907
+ "risk": "caution",
908
+ "needs_sudo": true,
909
+ "platforms": [
910
+ "pi",
911
+ "windows"
912
+ ],
913
+ "desc": "Enable unattended security updates",
914
+ "executable": true
915
+ },
916
+ "enable_zram": {
917
+ "slots": [],
918
+ "optional": [],
919
+ "risk": "caution",
920
+ "needs_sudo": true,
921
+ "platforms": [
922
+ "pi",
923
+ "windows"
924
+ ],
925
+ "desc": "Enable compressed RAM swap",
926
+ "executable": true
927
+ },
928
+ "expand_filesystem": {
929
+ "slots": [],
930
+ "optional": [],
931
+ "risk": "critical",
932
+ "needs_sudo": true,
933
+ "platforms": [
934
+ "pi"
935
+ ],
936
+ "desc": "Expand root filesystem",
937
+ "executable": true
938
+ },
939
+ "extract_archive": {
940
+ "slots": [
941
+ "path"
942
+ ],
943
+ "optional": [],
944
+ "risk": "safe",
945
+ "needs_sudo": false,
946
+ "platforms": [
947
+ "pi",
948
+ "windows"
949
+ ],
950
+ "desc": "Extract an archive",
951
+ "executable": true
952
+ },
953
+ "factory_reset": {
954
+ "slots": [],
955
+ "optional": [],
956
+ "risk": "critical",
957
+ "needs_sudo": true,
958
+ "platforms": [
959
+ "pi",
960
+ "windows"
961
+ ],
962
+ "desc": "factory reset computer",
963
+ "executable": true
964
+ },
965
+ "find_command": {
966
+ "slots": [
967
+ "name"
968
+ ],
969
+ "optional": [],
970
+ "risk": "safe",
971
+ "needs_sudo": false,
972
+ "platforms": [
973
+ "pi",
974
+ "windows"
975
+ ],
976
+ "desc": "Is a command installed / where",
977
+ "executable": true
978
+ },
979
+ "find_in_page": {
980
+ "slots": [
981
+ "query"
982
+ ],
983
+ "optional": [],
984
+ "risk": "safe",
985
+ "needs_sudo": false,
986
+ "platforms": [
987
+ "pi",
988
+ "windows"
989
+ ],
990
+ "desc": "Find text on page",
991
+ "executable": true
992
+ },
993
+ "firewall_allow": {
994
+ "slots": [
995
+ "port"
996
+ ],
997
+ "optional": [],
998
+ "risk": "caution",
999
+ "needs_sudo": true,
1000
+ "platforms": [
1001
+ "pi",
1002
+ "windows"
1003
+ ],
1004
+ "desc": "Allow a port",
1005
+ "executable": true
1006
+ },
1007
+ "firewall_deny": {
1008
+ "slots": [
1009
+ "port"
1010
+ ],
1011
+ "optional": [],
1012
+ "risk": "critical",
1013
+ "needs_sudo": true,
1014
+ "platforms": [
1015
+ "pi",
1016
+ "windows"
1017
+ ],
1018
+ "desc": "Block a port",
1019
+ "executable": true
1020
+ },
1021
+ "firewall_off": {
1022
+ "slots": [],
1023
+ "optional": [],
1024
+ "risk": "critical",
1025
+ "needs_sudo": true,
1026
+ "platforms": [
1027
+ "pi",
1028
+ "windows"
1029
+ ],
1030
+ "desc": "Turn firewall OFF (security risk)",
1031
+ "executable": true
1032
+ },
1033
+ "firewall_on": {
1034
+ "slots": [],
1035
+ "optional": [],
1036
+ "risk": "caution",
1037
+ "needs_sudo": true,
1038
+ "platforms": [
1039
+ "pi",
1040
+ "windows"
1041
+ ],
1042
+ "desc": "Turn firewall on",
1043
+ "executable": true
1044
+ },
1045
+ "firewall_status": {
1046
+ "slots": [],
1047
+ "optional": [],
1048
+ "risk": "safe",
1049
+ "needs_sudo": false,
1050
+ "platforms": [
1051
+ "pi",
1052
+ "windows"
1053
+ ],
1054
+ "desc": "show firewall status",
1055
+ "executable": true
1056
+ },
1057
+ "fix_gpio_permissions": {
1058
+ "slots": [],
1059
+ "optional": [],
1060
+ "risk": "caution",
1061
+ "needs_sudo": true,
1062
+ "platforms": [
1063
+ "pi"
1064
+ ],
1065
+ "desc": "Add user to gpio group / fix udev rules",
1066
+ "executable": true
1067
+ },
1068
+ "flash_firmware": {
1069
+ "slots": [],
1070
+ "optional": [],
1071
+ "risk": "critical",
1072
+ "needs_sudo": true,
1073
+ "platforms": [
1074
+ "pi",
1075
+ "windows"
1076
+ ],
1077
+ "desc": "Flash firmware / bootloader EEPROM",
1078
+ "executable": true
1079
+ },
1080
+ "flush_dns": {
1081
+ "slots": [],
1082
+ "optional": [],
1083
+ "risk": "caution",
1084
+ "needs_sudo": false,
1085
+ "platforms": [
1086
+ "pi",
1087
+ "windows"
1088
+ ],
1089
+ "desc": "Flush DNS cache",
1090
+ "executable": true
1091
+ },
1092
+ "forget_wifi": {
1093
+ "slots": [
1094
+ "ssid"
1095
+ ],
1096
+ "optional": [],
1097
+ "risk": "caution",
1098
+ "needs_sudo": false,
1099
+ "platforms": [
1100
+ "pi",
1101
+ "windows"
1102
+ ],
1103
+ "desc": "Forget a saved Wi-Fi network",
1104
+ "executable": true
1105
+ },
1106
+ "format_drive": {
1107
+ "slots": [],
1108
+ "optional": [],
1109
+ "risk": "critical",
1110
+ "needs_sudo": true,
1111
+ "platforms": [
1112
+ "pi",
1113
+ "windows"
1114
+ ],
1115
+ "desc": "format drive",
1116
+ "executable": true
1117
+ },
1118
+ "fullscreen": {
1119
+ "slots": [],
1120
+ "optional": [],
1121
+ "risk": "safe",
1122
+ "needs_sudo": false,
1123
+ "platforms": [
1124
+ "pi",
1125
+ "windows"
1126
+ ],
1127
+ "desc": "Toggle full screen (F11)",
1128
+ "executable": true
1129
+ },
1130
+ "get_bandwidth_usage": {
1131
+ "slots": [],
1132
+ "optional": [],
1133
+ "risk": "safe",
1134
+ "needs_sudo": false,
1135
+ "platforms": [
1136
+ "pi",
1137
+ "windows"
1138
+ ],
1139
+ "desc": "Live/historical bandwidth usage",
1140
+ "executable": true
1141
+ },
1142
+ "get_battery": {
1143
+ "slots": [],
1144
+ "optional": [],
1145
+ "risk": "safe",
1146
+ "needs_sudo": false,
1147
+ "platforms": [
1148
+ "pi",
1149
+ "windows"
1150
+ ],
1151
+ "desc": "Tell battery percentage / charging state",
1152
+ "executable": true
1153
+ },
1154
+ "get_boot_config": {
1155
+ "slots": [],
1156
+ "optional": [],
1157
+ "risk": "safe",
1158
+ "needs_sudo": false,
1159
+ "platforms": [
1160
+ "pi"
1161
+ ],
1162
+ "desc": "Active boot/firmware config",
1163
+ "executable": true
1164
+ },
1165
+ "get_boot_logs": {
1166
+ "slots": [],
1167
+ "optional": [],
1168
+ "risk": "safe",
1169
+ "needs_sudo": false,
1170
+ "platforms": [
1171
+ "pi",
1172
+ "windows"
1173
+ ],
1174
+ "desc": "Previous-boot logs",
1175
+ "executable": true
1176
+ },
1177
+ "get_boot_time": {
1178
+ "slots": [],
1179
+ "optional": [],
1180
+ "risk": "safe",
1181
+ "needs_sudo": false,
1182
+ "platforms": [
1183
+ "pi",
1184
+ "windows"
1185
+ ],
1186
+ "desc": "Boot time and slowest units",
1187
+ "executable": true
1188
+ },
1189
+ "get_brightness": {
1190
+ "slots": [],
1191
+ "optional": [],
1192
+ "risk": "safe",
1193
+ "needs_sudo": false,
1194
+ "platforms": [
1195
+ "pi",
1196
+ "windows"
1197
+ ],
1198
+ "desc": "show brightness",
1199
+ "executable": true
1200
+ },
1201
+ "get_cpu_clock": {
1202
+ "slots": [],
1203
+ "optional": [],
1204
+ "risk": "safe",
1205
+ "needs_sudo": false,
1206
+ "platforms": [
1207
+ "pi"
1208
+ ],
1209
+ "desc": "show cpu clock",
1210
+ "executable": true
1211
+ },
1212
+ "get_cpu_governor": {
1213
+ "slots": [],
1214
+ "optional": [],
1215
+ "risk": "safe",
1216
+ "needs_sudo": false,
1217
+ "platforms": [
1218
+ "pi"
1219
+ ],
1220
+ "desc": "Show CPU frequency governor",
1221
+ "executable": true
1222
+ },
1223
+ "get_cpu_pressure": {
1224
+ "slots": [],
1225
+ "optional": [],
1226
+ "risk": "safe",
1227
+ "needs_sudo": false,
1228
+ "platforms": [
1229
+ "pi",
1230
+ "windows"
1231
+ ],
1232
+ "desc": "CPU pressure (PSI)",
1233
+ "executable": true
1234
+ },
1235
+ "get_cpu_usage": {
1236
+ "slots": [],
1237
+ "optional": [],
1238
+ "risk": "safe",
1239
+ "needs_sudo": false,
1240
+ "platforms": [
1241
+ "pi",
1242
+ "windows"
1243
+ ],
1244
+ "desc": "Show CPU usage",
1245
+ "executable": true
1246
+ },
1247
+ "get_current_user": {
1248
+ "slots": [],
1249
+ "optional": [],
1250
+ "risk": "safe",
1251
+ "needs_sudo": false,
1252
+ "platforms": [
1253
+ "pi",
1254
+ "windows"
1255
+ ],
1256
+ "desc": "show current user",
1257
+ "executable": true
1258
+ },
1259
+ "get_date": {
1260
+ "slots": [],
1261
+ "optional": [],
1262
+ "risk": "safe",
1263
+ "needs_sudo": false,
1264
+ "platforms": [
1265
+ "pi",
1266
+ "windows"
1267
+ ],
1268
+ "desc": "Tell today's date / day",
1269
+ "executable": true
1270
+ },
1271
+ "get_default_gateway": {
1272
+ "slots": [],
1273
+ "optional": [],
1274
+ "risk": "safe",
1275
+ "needs_sudo": false,
1276
+ "platforms": [
1277
+ "pi",
1278
+ "windows"
1279
+ ],
1280
+ "desc": "Default gateway/routing",
1281
+ "executable": true
1282
+ },
1283
+ "get_diagnostics": {
1284
+ "slots": [],
1285
+ "optional": [],
1286
+ "risk": "safe",
1287
+ "needs_sudo": false,
1288
+ "platforms": [
1289
+ "pi",
1290
+ "windows"
1291
+ ],
1292
+ "desc": "Collect a full diagnostics/bug-report dump",
1293
+ "executable": true
1294
+ },
1295
+ "get_disk_health": {
1296
+ "slots": [],
1297
+ "optional": [],
1298
+ "risk": "safe",
1299
+ "needs_sudo": false,
1300
+ "platforms": [
1301
+ "pi",
1302
+ "windows"
1303
+ ],
1304
+ "desc": "Disk/SSD/NVMe SMART health",
1305
+ "executable": true
1306
+ },
1307
+ "get_disk_io": {
1308
+ "slots": [],
1309
+ "optional": [],
1310
+ "risk": "safe",
1311
+ "needs_sudo": false,
1312
+ "platforms": [
1313
+ "pi",
1314
+ "windows"
1315
+ ],
1316
+ "desc": "Live disk I/O by process",
1317
+ "executable": true
1318
+ },
1319
+ "get_disk_space": {
1320
+ "slots": [],
1321
+ "optional": [],
1322
+ "risk": "safe",
1323
+ "needs_sudo": false,
1324
+ "platforms": [
1325
+ "pi",
1326
+ "windows"
1327
+ ],
1328
+ "desc": "Show disk / storage space",
1329
+ "executable": true
1330
+ },
1331
+ "get_ethernet_status": {
1332
+ "slots": [],
1333
+ "optional": [],
1334
+ "risk": "safe",
1335
+ "needs_sudo": false,
1336
+ "platforms": [
1337
+ "pi",
1338
+ "windows"
1339
+ ],
1340
+ "desc": "Ethernet link speed/duplex",
1341
+ "executable": true
1342
+ },
1343
+ "get_fan_speed": {
1344
+ "slots": [],
1345
+ "optional": [],
1346
+ "risk": "safe",
1347
+ "needs_sudo": false,
1348
+ "platforms": [
1349
+ "pi"
1350
+ ],
1351
+ "desc": "Fan RPM",
1352
+ "executable": true
1353
+ },
1354
+ "get_firmware_log": {
1355
+ "slots": [],
1356
+ "optional": [],
1357
+ "risk": "safe",
1358
+ "needs_sudo": false,
1359
+ "platforms": [
1360
+ "pi"
1361
+ ],
1362
+ "desc": "VideoCore firmware log",
1363
+ "executable": true
1364
+ },
1365
+ "get_firmware_version": {
1366
+ "slots": [],
1367
+ "optional": [],
1368
+ "risk": "safe",
1369
+ "needs_sudo": false,
1370
+ "platforms": [
1371
+ "pi"
1372
+ ],
1373
+ "desc": "show firmware version",
1374
+ "executable": true
1375
+ },
1376
+ "get_folder_sizes": {
1377
+ "slots": [],
1378
+ "optional": [],
1379
+ "risk": "safe",
1380
+ "needs_sudo": false,
1381
+ "platforms": [
1382
+ "pi",
1383
+ "windows"
1384
+ ],
1385
+ "desc": "Which folders use the most space",
1386
+ "executable": true
1387
+ },
1388
+ "get_gpu_memory": {
1389
+ "slots": [],
1390
+ "optional": [],
1391
+ "risk": "safe",
1392
+ "needs_sudo": false,
1393
+ "platforms": [
1394
+ "pi"
1395
+ ],
1396
+ "desc": "GPU/VideoCore memory split",
1397
+ "executable": true
1398
+ },
1399
+ "get_gpu_usage": {
1400
+ "slots": [],
1401
+ "optional": [],
1402
+ "risk": "safe",
1403
+ "needs_sudo": false,
1404
+ "platforms": [
1405
+ "pi",
1406
+ "windows"
1407
+ ],
1408
+ "desc": "GPU usage",
1409
+ "executable": true
1410
+ },
1411
+ "get_hostname": {
1412
+ "slots": [],
1413
+ "optional": [],
1414
+ "risk": "safe",
1415
+ "needs_sudo": false,
1416
+ "platforms": [
1417
+ "pi",
1418
+ "windows"
1419
+ ],
1420
+ "desc": "show hostname",
1421
+ "executable": true
1422
+ },
1423
+ "get_interrupts": {
1424
+ "slots": [],
1425
+ "optional": [],
1426
+ "risk": "safe",
1427
+ "needs_sudo": false,
1428
+ "platforms": [
1429
+ "pi",
1430
+ "windows"
1431
+ ],
1432
+ "desc": "IRQ counts",
1433
+ "executable": true
1434
+ },
1435
+ "get_ip": {
1436
+ "slots": [],
1437
+ "optional": [],
1438
+ "risk": "safe",
1439
+ "needs_sudo": false,
1440
+ "platforms": [
1441
+ "pi",
1442
+ "windows"
1443
+ ],
1444
+ "desc": "Show IP address",
1445
+ "executable": true
1446
+ },
1447
+ "get_kernel_log": {
1448
+ "slots": [],
1449
+ "optional": [],
1450
+ "risk": "safe",
1451
+ "needs_sudo": false,
1452
+ "platforms": [
1453
+ "pi",
1454
+ "windows"
1455
+ ],
1456
+ "desc": "Show kernel ring-buffer (dmesg)",
1457
+ "executable": true
1458
+ },
1459
+ "get_kernel_version": {
1460
+ "slots": [],
1461
+ "optional": [],
1462
+ "risk": "safe",
1463
+ "needs_sudo": false,
1464
+ "platforms": [
1465
+ "pi",
1466
+ "windows"
1467
+ ],
1468
+ "desc": "Show kernel version",
1469
+ "executable": true
1470
+ },
1471
+ "get_load_average": {
1472
+ "slots": [],
1473
+ "optional": [],
1474
+ "risk": "safe",
1475
+ "needs_sudo": false,
1476
+ "platforms": [
1477
+ "pi",
1478
+ "windows"
1479
+ ],
1480
+ "desc": "Show system load average",
1481
+ "executable": true
1482
+ },
1483
+ "get_mac_address": {
1484
+ "slots": [],
1485
+ "optional": [],
1486
+ "risk": "safe",
1487
+ "needs_sudo": false,
1488
+ "platforms": [
1489
+ "pi",
1490
+ "windows"
1491
+ ],
1492
+ "desc": "Show MAC address",
1493
+ "executable": true
1494
+ },
1495
+ "get_memory_pressure": {
1496
+ "slots": [],
1497
+ "optional": [],
1498
+ "risk": "safe",
1499
+ "needs_sudo": false,
1500
+ "platforms": [
1501
+ "pi",
1502
+ "windows"
1503
+ ],
1504
+ "desc": "Memory pressure (PSI)",
1505
+ "executable": true
1506
+ },
1507
+ "get_per_core_usage": {
1508
+ "slots": [],
1509
+ "optional": [],
1510
+ "risk": "safe",
1511
+ "needs_sudo": false,
1512
+ "platforms": [
1513
+ "pi",
1514
+ "windows"
1515
+ ],
1516
+ "desc": "Per-core CPU usage",
1517
+ "executable": true
1518
+ },
1519
+ "get_power_draw": {
1520
+ "slots": [],
1521
+ "optional": [],
1522
+ "risk": "safe",
1523
+ "needs_sudo": false,
1524
+ "platforms": [
1525
+ "pi"
1526
+ ],
1527
+ "desc": "Show board power draw (Pi5 PMIC)",
1528
+ "executable": true
1529
+ },
1530
+ "get_public_ip": {
1531
+ "slots": [],
1532
+ "optional": [],
1533
+ "risk": "safe",
1534
+ "needs_sudo": false,
1535
+ "platforms": [
1536
+ "pi",
1537
+ "windows"
1538
+ ],
1539
+ "desc": "Show public IP",
1540
+ "executable": true
1541
+ },
1542
+ "get_radio_status": {
1543
+ "slots": [],
1544
+ "optional": [],
1545
+ "risk": "safe",
1546
+ "needs_sudo": false,
1547
+ "platforms": [
1548
+ "pi",
1549
+ "windows"
1550
+ ],
1551
+ "desc": "Is Wi-Fi/BT blocked (rfkill)",
1552
+ "executable": true
1553
+ },
1554
+ "get_ram_usage": {
1555
+ "slots": [],
1556
+ "optional": [],
1557
+ "risk": "safe",
1558
+ "needs_sudo": false,
1559
+ "platforms": [
1560
+ "pi",
1561
+ "windows"
1562
+ ],
1563
+ "desc": "Show RAM / memory usage",
1564
+ "executable": true
1565
+ },
1566
+ "get_reboot_history": {
1567
+ "slots": [],
1568
+ "optional": [],
1569
+ "risk": "safe",
1570
+ "needs_sudo": false,
1571
+ "platforms": [
1572
+ "pi",
1573
+ "windows"
1574
+ ],
1575
+ "desc": "Reboot/shutdown history",
1576
+ "executable": true
1577
+ },
1578
+ "get_sdcard_info": {
1579
+ "slots": [],
1580
+ "optional": [],
1581
+ "risk": "safe",
1582
+ "needs_sudo": false,
1583
+ "platforms": [
1584
+ "pi"
1585
+ ],
1586
+ "desc": "SD card manufacturer/model",
1587
+ "executable": true
1588
+ },
1589
+ "get_service_logs": {
1590
+ "slots": [
1591
+ "service"
1592
+ ],
1593
+ "optional": [],
1594
+ "risk": "safe",
1595
+ "needs_sudo": false,
1596
+ "platforms": [
1597
+ "pi",
1598
+ "windows"
1599
+ ],
1600
+ "desc": "Show a service's logs",
1601
+ "executable": true
1602
+ },
1603
+ "get_slab_usage": {
1604
+ "slots": [],
1605
+ "optional": [],
1606
+ "risk": "safe",
1607
+ "needs_sudo": false,
1608
+ "platforms": [
1609
+ "pi",
1610
+ "windows"
1611
+ ],
1612
+ "desc": "Kernel slab cache usage",
1613
+ "executable": true
1614
+ },
1615
+ "get_swap_usage": {
1616
+ "slots": [],
1617
+ "optional": [],
1618
+ "risk": "safe",
1619
+ "needs_sudo": false,
1620
+ "platforms": [
1621
+ "pi",
1622
+ "windows"
1623
+ ],
1624
+ "desc": "Swap usage",
1625
+ "executable": true
1626
+ },
1627
+ "get_system_info": {
1628
+ "slots": [],
1629
+ "optional": [],
1630
+ "risk": "safe",
1631
+ "needs_sudo": false,
1632
+ "platforms": [
1633
+ "pi",
1634
+ "windows"
1635
+ ],
1636
+ "desc": "Show system information (OS, CPU, model)",
1637
+ "executable": true
1638
+ },
1639
+ "get_temperature": {
1640
+ "slots": [],
1641
+ "optional": [],
1642
+ "risk": "safe",
1643
+ "needs_sudo": false,
1644
+ "platforms": [
1645
+ "pi",
1646
+ "windows"
1647
+ ],
1648
+ "desc": "CPU / SoC temperature",
1649
+ "executable": true
1650
+ },
1651
+ "get_throttle_status": {
1652
+ "slots": [],
1653
+ "optional": [],
1654
+ "risk": "safe",
1655
+ "needs_sudo": false,
1656
+ "platforms": [
1657
+ "pi",
1658
+ "windows"
1659
+ ],
1660
+ "desc": "Under-voltage / throttling status",
1661
+ "executable": true
1662
+ },
1663
+ "get_time": {
1664
+ "slots": [],
1665
+ "optional": [],
1666
+ "risk": "safe",
1667
+ "needs_sudo": false,
1668
+ "platforms": [
1669
+ "pi",
1670
+ "windows"
1671
+ ],
1672
+ "desc": "Tell the current time",
1673
+ "executable": true
1674
+ },
1675
+ "get_time_sync": {
1676
+ "slots": [],
1677
+ "optional": [],
1678
+ "risk": "safe",
1679
+ "needs_sudo": false,
1680
+ "platforms": [
1681
+ "pi",
1682
+ "windows"
1683
+ ],
1684
+ "desc": "NTP/time sync status",
1685
+ "executable": true
1686
+ },
1687
+ "get_uptime": {
1688
+ "slots": [],
1689
+ "optional": [],
1690
+ "risk": "safe",
1691
+ "needs_sudo": false,
1692
+ "platforms": [
1693
+ "pi",
1694
+ "windows"
1695
+ ],
1696
+ "desc": "Show how long the system has been running",
1697
+ "executable": true
1698
+ },
1699
+ "get_voltage": {
1700
+ "slots": [],
1701
+ "optional": [],
1702
+ "risk": "safe",
1703
+ "needs_sudo": false,
1704
+ "platforms": [
1705
+ "pi"
1706
+ ],
1707
+ "desc": "show core voltage",
1708
+ "executable": true
1709
+ },
1710
+ "get_volume": {
1711
+ "slots": [],
1712
+ "optional": [],
1713
+ "risk": "safe",
1714
+ "needs_sudo": false,
1715
+ "platforms": [
1716
+ "pi",
1717
+ "windows"
1718
+ ],
1719
+ "desc": "Tell current volume",
1720
+ "executable": true
1721
+ },
1722
+ "get_wifi_signal": {
1723
+ "slots": [],
1724
+ "optional": [],
1725
+ "risk": "safe",
1726
+ "needs_sudo": false,
1727
+ "platforms": [
1728
+ "pi",
1729
+ "windows"
1730
+ ],
1731
+ "desc": "Wi-Fi signal strength",
1732
+ "executable": true
1733
+ },
1734
+ "gpio_alt_functions": {
1735
+ "slots": [
1736
+ "pin"
1737
+ ],
1738
+ "optional": [
1739
+ "numbering"
1740
+ ],
1741
+ "risk": "safe",
1742
+ "needs_sudo": false,
1743
+ "platforms": [
1744
+ "pi"
1745
+ ],
1746
+ "desc": "List ALT functions of a pin",
1747
+ "executable": true
1748
+ },
1749
+ "gpio_blink": {
1750
+ "slots": [
1751
+ "pin"
1752
+ ],
1753
+ "optional": [
1754
+ "numbering",
1755
+ "interval",
1756
+ "count"
1757
+ ],
1758
+ "risk": "caution",
1759
+ "needs_sudo": false,
1760
+ "platforms": [
1761
+ "pi"
1762
+ ],
1763
+ "desc": "Blink a pin (optional interval ms, count)",
1764
+ "executable": true
1765
+ },
1766
+ "gpio_conflicts": {
1767
+ "slots": [],
1768
+ "optional": [],
1769
+ "risk": "safe",
1770
+ "needs_sudo": false,
1771
+ "platforms": [
1772
+ "pi"
1773
+ ],
1774
+ "desc": "Which pins are reserved by overlays / I2C / SPI / UART",
1775
+ "executable": true
1776
+ },
1777
+ "gpio_debug": {
1778
+ "slots": [
1779
+ "pin"
1780
+ ],
1781
+ "optional": [
1782
+ "numbering"
1783
+ ],
1784
+ "risk": "safe",
1785
+ "needs_sudo": false,
1786
+ "platforms": [
1787
+ "pi"
1788
+ ],
1789
+ "desc": "Diagnose one pin: mode, level, pull, overlay conflicts, chip, permissions",
1790
+ "executable": true
1791
+ },
1792
+ "gpio_debug_all": {
1793
+ "slots": [],
1794
+ "optional": [],
1795
+ "risk": "safe",
1796
+ "needs_sudo": false,
1797
+ "platforms": [
1798
+ "pi"
1799
+ ],
1800
+ "desc": "Diagnose the whole GPIO subsystem",
1801
+ "executable": true
1802
+ },
1803
+ "gpio_info": {
1804
+ "slots": [
1805
+ "pin"
1806
+ ],
1807
+ "optional": [
1808
+ "numbering"
1809
+ ],
1810
+ "risk": "safe",
1811
+ "needs_sudo": false,
1812
+ "platforms": [
1813
+ "pi"
1814
+ ],
1815
+ "desc": "Live mode/level/pull of a pin (pinctrl get)",
1816
+ "executable": true
1817
+ },
1818
+ "gpio_off": {
1819
+ "slots": [
1820
+ "pin"
1821
+ ],
1822
+ "optional": [
1823
+ "numbering"
1824
+ ],
1825
+ "risk": "critical",
1826
+ "needs_sudo": true,
1827
+ "platforms": [
1828
+ "pi",
1829
+ "windows"
1830
+ ],
1831
+ "desc": "Set a GPIO pin LOW",
1832
+ "executable": true
1833
+ },
1834
+ "gpio_on": {
1835
+ "slots": [
1836
+ "pin"
1837
+ ],
1838
+ "optional": [
1839
+ "numbering"
1840
+ ],
1841
+ "risk": "critical",
1842
+ "needs_sudo": true,
1843
+ "platforms": [
1844
+ "pi",
1845
+ "windows"
1846
+ ],
1847
+ "desc": "Set a GPIO pin HIGH (e.g. relay / LED on)",
1848
+ "executable": true
1849
+ },
1850
+ "gpio_pin_role": {
1851
+ "slots": [],
1852
+ "optional": [
1853
+ "pin",
1854
+ "numbering",
1855
+ "role"
1856
+ ],
1857
+ "risk": "safe",
1858
+ "needs_sudo": false,
1859
+ "platforms": [
1860
+ "pi"
1861
+ ],
1862
+ "desc": "What a pin is for (SDA/SCL/TXD/GND...) or where a role is",
1863
+ "executable": true
1864
+ },
1865
+ "gpio_pulse": {
1866
+ "slots": [
1867
+ "pin",
1868
+ "amount",
1869
+ "unit"
1870
+ ],
1871
+ "optional": [
1872
+ "numbering"
1873
+ ],
1874
+ "risk": "caution",
1875
+ "needs_sudo": false,
1876
+ "platforms": [
1877
+ "pi"
1878
+ ],
1879
+ "desc": "Set a pin high for a duration then low",
1880
+ "executable": true
1881
+ },
1882
+ "gpio_pwm": {
1883
+ "slots": [
1884
+ "pin",
1885
+ "duty"
1886
+ ],
1887
+ "optional": [
1888
+ "numbering",
1889
+ "freq"
1890
+ ],
1891
+ "risk": "caution",
1892
+ "needs_sudo": true,
1893
+ "platforms": [
1894
+ "pi"
1895
+ ],
1896
+ "desc": "PWM on a pin (duty %, optional Hz)",
1897
+ "executable": true
1898
+ },
1899
+ "gpio_read": {
1900
+ "slots": [
1901
+ "pin"
1902
+ ],
1903
+ "optional": [
1904
+ "numbering"
1905
+ ],
1906
+ "risk": "caution",
1907
+ "needs_sudo": false,
1908
+ "platforms": [
1909
+ "pi",
1910
+ "windows"
1911
+ ],
1912
+ "desc": "Read GPIO pin state",
1913
+ "executable": true
1914
+ },
1915
+ "gpio_reset": {
1916
+ "slots": [
1917
+ "pin"
1918
+ ],
1919
+ "optional": [
1920
+ "numbering"
1921
+ ],
1922
+ "risk": "caution",
1923
+ "needs_sudo": false,
1924
+ "platforms": [
1925
+ "pi"
1926
+ ],
1927
+ "desc": "Reset a pin to default input",
1928
+ "executable": true
1929
+ },
1930
+ "gpio_reset_all": {
1931
+ "slots": [],
1932
+ "optional": [],
1933
+ "risk": "caution",
1934
+ "needs_sudo": false,
1935
+ "platforms": [
1936
+ "pi"
1937
+ ],
1938
+ "desc": "Reset all GPIO pins",
1939
+ "executable": true
1940
+ },
1941
+ "gpio_servo": {
1942
+ "slots": [
1943
+ "pin",
1944
+ "angle"
1945
+ ],
1946
+ "optional": [
1947
+ "numbering"
1948
+ ],
1949
+ "risk": "caution",
1950
+ "needs_sudo": true,
1951
+ "platforms": [
1952
+ "pi"
1953
+ ],
1954
+ "desc": "Move a servo on a pin to an angle",
1955
+ "executable": true
1956
+ },
1957
+ "gpio_set_alt": {
1958
+ "slots": [
1959
+ "pin",
1960
+ "alt"
1961
+ ],
1962
+ "optional": [
1963
+ "numbering"
1964
+ ],
1965
+ "risk": "critical",
1966
+ "needs_sudo": true,
1967
+ "platforms": [
1968
+ "pi"
1969
+ ],
1970
+ "desc": "Set a pin to an ALT function",
1971
+ "executable": true
1972
+ },
1973
+ "gpio_set_mode": {
1974
+ "slots": [
1975
+ "pin",
1976
+ "mode"
1977
+ ],
1978
+ "optional": [
1979
+ "numbering"
1980
+ ],
1981
+ "risk": "caution",
1982
+ "needs_sudo": false,
1983
+ "platforms": [
1984
+ "pi"
1985
+ ],
1986
+ "desc": "Set a GPIO pin as input or output",
1987
+ "executable": true
1988
+ },
1989
+ "gpio_set_pull": {
1990
+ "slots": [
1991
+ "pin",
1992
+ "pull"
1993
+ ],
1994
+ "optional": [
1995
+ "numbering"
1996
+ ],
1997
+ "risk": "caution",
1998
+ "needs_sudo": false,
1999
+ "platforms": [
2000
+ "pi"
2001
+ ],
2002
+ "desc": "Set internal pull-up/down/none on a pin",
2003
+ "executable": true
2004
+ },
2005
+ "gpio_stop_watch": {
2006
+ "slots": [],
2007
+ "optional": [
2008
+ "pin",
2009
+ "numbering"
2010
+ ],
2011
+ "risk": "safe",
2012
+ "needs_sudo": false,
2013
+ "platforms": [
2014
+ "pi"
2015
+ ],
2016
+ "desc": "Stop GPIO monitoring",
2017
+ "executable": true
2018
+ },
2019
+ "gpio_toggle": {
2020
+ "slots": [
2021
+ "pin"
2022
+ ],
2023
+ "optional": [
2024
+ "numbering"
2025
+ ],
2026
+ "risk": "caution",
2027
+ "needs_sudo": true,
2028
+ "platforms": [
2029
+ "pi"
2030
+ ],
2031
+ "desc": "Toggle GPIO pin",
2032
+ "executable": true
2033
+ },
2034
+ "gpio_watch": {
2035
+ "slots": [
2036
+ "pin"
2037
+ ],
2038
+ "optional": [
2039
+ "numbering",
2040
+ "edge"
2041
+ ],
2042
+ "risk": "safe",
2043
+ "needs_sudo": false,
2044
+ "platforms": [
2045
+ "pi"
2046
+ ],
2047
+ "desc": "Monitor a pin for edges / button presses",
2048
+ "executable": true
2049
+ },
2050
+ "harden_ssh": {
2051
+ "slots": [],
2052
+ "optional": [],
2053
+ "risk": "critical",
2054
+ "needs_sudo": true,
2055
+ "platforms": [
2056
+ "pi",
2057
+ "windows"
2058
+ ],
2059
+ "desc": "Harden sshd (key-only, no root)",
2060
+ "executable": true
2061
+ },
2062
+ "hash_file": {
2063
+ "slots": [
2064
+ "path"
2065
+ ],
2066
+ "optional": [],
2067
+ "risk": "safe",
2068
+ "needs_sudo": false,
2069
+ "platforms": [
2070
+ "pi",
2071
+ "windows"
2072
+ ],
2073
+ "desc": "hash file \"{path}\"",
2074
+ "executable": true
2075
+ },
2076
+ "help": {
2077
+ "slots": [],
2078
+ "optional": [],
2079
+ "risk": "safe",
2080
+ "needs_sudo": false,
2081
+ "platforms": [
2082
+ "pi",
2083
+ "windows"
2084
+ ],
2085
+ "desc": "help",
2086
+ "executable": true
2087
+ },
2088
+ "hibernate": {
2089
+ "slots": [],
2090
+ "optional": [],
2091
+ "risk": "critical",
2092
+ "needs_sudo": false,
2093
+ "platforms": [
2094
+ "pi",
2095
+ "windows"
2096
+ ],
2097
+ "desc": "Hibernate",
2098
+ "executable": true
2099
+ },
2100
+ "high_contrast_off": {
2101
+ "slots": [],
2102
+ "optional": [],
2103
+ "risk": "safe",
2104
+ "needs_sudo": false,
2105
+ "platforms": [
2106
+ "pi",
2107
+ "windows"
2108
+ ],
2109
+ "desc": "High contrast off",
2110
+ "executable": true
2111
+ },
2112
+ "high_contrast_on": {
2113
+ "slots": [],
2114
+ "optional": [],
2115
+ "risk": "safe",
2116
+ "needs_sudo": false,
2117
+ "platforms": [
2118
+ "pi",
2119
+ "windows"
2120
+ ],
2121
+ "desc": "High contrast on",
2122
+ "executable": true
2123
+ },
2124
+ "hotspot_off": {
2125
+ "slots": [],
2126
+ "optional": [],
2127
+ "risk": "safe",
2128
+ "needs_sudo": false,
2129
+ "platforms": [
2130
+ "pi",
2131
+ "windows"
2132
+ ],
2133
+ "desc": "Turn mobile hotspot off",
2134
+ "executable": true
2135
+ },
2136
+ "hotspot_on": {
2137
+ "slots": [],
2138
+ "optional": [
2139
+ "ssid",
2140
+ "password"
2141
+ ],
2142
+ "risk": "safe",
2143
+ "needs_sudo": false,
2144
+ "platforms": [
2145
+ "pi",
2146
+ "windows"
2147
+ ],
2148
+ "desc": "Turn on hotspot (optional ssid/password)",
2149
+ "executable": true
2150
+ },
2151
+ "i2c_dump": {
2152
+ "slots": [
2153
+ "address"
2154
+ ],
2155
+ "optional": [],
2156
+ "risk": "safe",
2157
+ "needs_sudo": false,
2158
+ "platforms": [
2159
+ "pi"
2160
+ ],
2161
+ "desc": "Dump all registers of an I2C device",
2162
+ "executable": true
2163
+ },
2164
+ "i2c_read": {
2165
+ "slots": [
2166
+ "address",
2167
+ "register"
2168
+ ],
2169
+ "optional": [],
2170
+ "risk": "safe",
2171
+ "needs_sudo": false,
2172
+ "platforms": [
2173
+ "pi"
2174
+ ],
2175
+ "desc": "Read a register from an I2C device",
2176
+ "executable": true
2177
+ },
2178
+ "i2c_scan": {
2179
+ "slots": [],
2180
+ "optional": [],
2181
+ "risk": "safe",
2182
+ "needs_sudo": false,
2183
+ "platforms": [
2184
+ "pi"
2185
+ ],
2186
+ "desc": "Scan I2C bus",
2187
+ "executable": true
2188
+ },
2189
+ "i2c_write": {
2190
+ "slots": [
2191
+ "address",
2192
+ "register",
2193
+ "value"
2194
+ ],
2195
+ "optional": [],
2196
+ "risk": "critical",
2197
+ "needs_sudo": true,
2198
+ "platforms": [
2199
+ "pi"
2200
+ ],
2201
+ "desc": "Write a value to an I2C register",
2202
+ "executable": true
2203
+ },
2204
+ "incognito_window": {
2205
+ "slots": [],
2206
+ "optional": [],
2207
+ "risk": "safe",
2208
+ "needs_sudo": false,
2209
+ "platforms": [
2210
+ "pi",
2211
+ "windows"
2212
+ ],
2213
+ "desc": "Private/incognito window",
2214
+ "executable": true
2215
+ },
2216
+ "install_package": {
2217
+ "slots": [
2218
+ "name"
2219
+ ],
2220
+ "optional": [],
2221
+ "risk": "caution",
2222
+ "needs_sudo": true,
2223
+ "platforms": [
2224
+ "pi",
2225
+ "windows"
2226
+ ],
2227
+ "desc": "Install a package/application by name",
2228
+ "executable": true
2229
+ },
2230
+ "install_python_package": {
2231
+ "slots": [
2232
+ "name"
2233
+ ],
2234
+ "optional": [],
2235
+ "risk": "caution",
2236
+ "needs_sudo": false,
2237
+ "platforms": [
2238
+ "pi",
2239
+ "windows"
2240
+ ],
2241
+ "desc": "pip-install a Python package",
2242
+ "executable": true
2243
+ },
2244
+ "install_updates": {
2245
+ "slots": [],
2246
+ "optional": [],
2247
+ "risk": "critical",
2248
+ "needs_sudo": true,
2249
+ "platforms": [
2250
+ "pi",
2251
+ "windows"
2252
+ ],
2253
+ "desc": "Install OS updates (may reboot)",
2254
+ "executable": true
2255
+ },
2256
+ "interface_disable": {
2257
+ "slots": [
2258
+ "interface"
2259
+ ],
2260
+ "optional": [],
2261
+ "risk": "critical",
2262
+ "needs_sudo": true,
2263
+ "platforms": [
2264
+ "pi"
2265
+ ],
2266
+ "desc": "Disable Pi interface",
2267
+ "executable": true
2268
+ },
2269
+ "interface_enable": {
2270
+ "slots": [
2271
+ "interface"
2272
+ ],
2273
+ "optional": [],
2274
+ "risk": "critical",
2275
+ "needs_sudo": true,
2276
+ "platforms": [
2277
+ "pi"
2278
+ ],
2279
+ "desc": "Enable Pi interface (i2c/spi/serial/onewire/camera)",
2280
+ "executable": true
2281
+ },
2282
+ "kill_process": {
2283
+ "slots": [
2284
+ "pid"
2285
+ ],
2286
+ "optional": [],
2287
+ "risk": "critical",
2288
+ "needs_sudo": false,
2289
+ "platforms": [
2290
+ "pi",
2291
+ "windows"
2292
+ ],
2293
+ "desc": "kill process {pid}",
2294
+ "executable": true
2295
+ },
2296
+ "list_1wire_sensors": {
2297
+ "slots": [],
2298
+ "optional": [],
2299
+ "risk": "safe",
2300
+ "needs_sudo": false,
2301
+ "platforms": [
2302
+ "pi"
2303
+ ],
2304
+ "desc": "List 1-Wire sensors",
2305
+ "executable": true
2306
+ },
2307
+ "list_arp": {
2308
+ "slots": [],
2309
+ "optional": [],
2310
+ "risk": "safe",
2311
+ "needs_sudo": false,
2312
+ "platforms": [
2313
+ "pi",
2314
+ "windows"
2315
+ ],
2316
+ "desc": "ARP table (IP to MAC)",
2317
+ "executable": true
2318
+ },
2319
+ "list_audio_devices": {
2320
+ "slots": [],
2321
+ "optional": [],
2322
+ "risk": "safe",
2323
+ "needs_sudo": false,
2324
+ "platforms": [
2325
+ "pi",
2326
+ "windows"
2327
+ ],
2328
+ "desc": "List audio capture/playback devices",
2329
+ "executable": true
2330
+ },
2331
+ "list_banned_ips": {
2332
+ "slots": [],
2333
+ "optional": [],
2334
+ "risk": "safe",
2335
+ "needs_sudo": false,
2336
+ "platforms": [
2337
+ "pi",
2338
+ "windows"
2339
+ ],
2340
+ "desc": "List fail2ban bans",
2341
+ "executable": true
2342
+ },
2343
+ "list_bluetooth_devices": {
2344
+ "slots": [],
2345
+ "optional": [],
2346
+ "risk": "safe",
2347
+ "needs_sudo": false,
2348
+ "platforms": [
2349
+ "pi",
2350
+ "windows"
2351
+ ],
2352
+ "desc": "List Bluetooth devices",
2353
+ "executable": true
2354
+ },
2355
+ "list_cameras": {
2356
+ "slots": [],
2357
+ "optional": [],
2358
+ "risk": "safe",
2359
+ "needs_sudo": false,
2360
+ "platforms": [
2361
+ "pi"
2362
+ ],
2363
+ "desc": "list cameras",
2364
+ "executable": true
2365
+ },
2366
+ "list_connections": {
2367
+ "slots": [],
2368
+ "optional": [],
2369
+ "risk": "safe",
2370
+ "needs_sudo": false,
2371
+ "platforms": [
2372
+ "pi",
2373
+ "windows"
2374
+ ],
2375
+ "desc": "show network connections",
2376
+ "executable": true
2377
+ },
2378
+ "list_disks": {
2379
+ "slots": [],
2380
+ "optional": [],
2381
+ "risk": "safe",
2382
+ "needs_sudo": false,
2383
+ "platforms": [
2384
+ "pi",
2385
+ "windows"
2386
+ ],
2387
+ "desc": "list disk devices",
2388
+ "executable": true
2389
+ },
2390
+ "list_displays": {
2391
+ "slots": [],
2392
+ "optional": [],
2393
+ "risk": "safe",
2394
+ "needs_sudo": false,
2395
+ "platforms": [
2396
+ "pi",
2397
+ "windows"
2398
+ ],
2399
+ "desc": "List connected displays and resolution",
2400
+ "executable": true
2401
+ },
2402
+ "list_failed_services": {
2403
+ "slots": [],
2404
+ "optional": [],
2405
+ "risk": "safe",
2406
+ "needs_sudo": false,
2407
+ "platforms": [
2408
+ "pi",
2409
+ "windows"
2410
+ ],
2411
+ "desc": "List failed services",
2412
+ "executable": true
2413
+ },
2414
+ "list_files": {
2415
+ "slots": [
2416
+ "path"
2417
+ ],
2418
+ "optional": [],
2419
+ "risk": "safe",
2420
+ "needs_sudo": false,
2421
+ "platforms": [
2422
+ "pi",
2423
+ "windows"
2424
+ ],
2425
+ "desc": "list files in \"{path}\"",
2426
+ "executable": true
2427
+ },
2428
+ "list_free_gpio": {
2429
+ "slots": [],
2430
+ "optional": [],
2431
+ "risk": "safe",
2432
+ "needs_sudo": false,
2433
+ "platforms": [
2434
+ "pi"
2435
+ ],
2436
+ "desc": "List unused GPIO pins",
2437
+ "executable": true
2438
+ },
2439
+ "list_gpio": {
2440
+ "slots": [],
2441
+ "optional": [],
2442
+ "risk": "safe",
2443
+ "needs_sudo": false,
2444
+ "platforms": [
2445
+ "pi"
2446
+ ],
2447
+ "desc": "Read all GPIO pin states",
2448
+ "executable": true
2449
+ },
2450
+ "list_gpio_chips": {
2451
+ "slots": [],
2452
+ "optional": [],
2453
+ "risk": "safe",
2454
+ "needs_sudo": false,
2455
+ "platforms": [
2456
+ "pi"
2457
+ ],
2458
+ "desc": "List gpiochips (gpiodetect)",
2459
+ "executable": true
2460
+ },
2461
+ "list_installed_apps": {
2462
+ "slots": [],
2463
+ "optional": [],
2464
+ "risk": "safe",
2465
+ "needs_sudo": false,
2466
+ "platforms": [
2467
+ "pi",
2468
+ "windows"
2469
+ ],
2470
+ "desc": "List installed apps",
2471
+ "executable": true
2472
+ },
2473
+ "list_kernel_modules": {
2474
+ "slots": [],
2475
+ "optional": [],
2476
+ "risk": "safe",
2477
+ "needs_sudo": false,
2478
+ "platforms": [
2479
+ "pi",
2480
+ "windows"
2481
+ ],
2482
+ "desc": "List loaded kernel modules",
2483
+ "executable": true
2484
+ },
2485
+ "list_llm_models": {
2486
+ "slots": [],
2487
+ "optional": [],
2488
+ "risk": "safe",
2489
+ "needs_sudo": false,
2490
+ "platforms": [
2491
+ "pi",
2492
+ "windows"
2493
+ ],
2494
+ "desc": "List local LLM models",
2495
+ "executable": true
2496
+ },
2497
+ "list_logged_in_users": {
2498
+ "slots": [],
2499
+ "optional": [],
2500
+ "risk": "safe",
2501
+ "needs_sudo": false,
2502
+ "platforms": [
2503
+ "pi",
2504
+ "windows"
2505
+ ],
2506
+ "desc": "Who is logged in",
2507
+ "executable": true
2508
+ },
2509
+ "list_open_files": {
2510
+ "slots": [],
2511
+ "optional": [
2512
+ "device"
2513
+ ],
2514
+ "risk": "safe",
2515
+ "needs_sudo": false,
2516
+ "platforms": [
2517
+ "pi",
2518
+ "windows"
2519
+ ],
2520
+ "desc": "What holds a device/port/file open",
2521
+ "executable": true
2522
+ },
2523
+ "list_open_ports": {
2524
+ "slots": [],
2525
+ "optional": [],
2526
+ "risk": "safe",
2527
+ "needs_sudo": false,
2528
+ "platforms": [
2529
+ "pi",
2530
+ "windows"
2531
+ ],
2532
+ "desc": "List open/listening ports",
2533
+ "executable": true
2534
+ },
2535
+ "list_packages": {
2536
+ "slots": [],
2537
+ "optional": [],
2538
+ "risk": "safe",
2539
+ "needs_sudo": false,
2540
+ "platforms": [
2541
+ "pi",
2542
+ "windows"
2543
+ ],
2544
+ "desc": "List installed packages",
2545
+ "executable": true
2546
+ },
2547
+ "list_partitions": {
2548
+ "slots": [],
2549
+ "optional": [],
2550
+ "risk": "safe",
2551
+ "needs_sudo": false,
2552
+ "platforms": [
2553
+ "pi",
2554
+ "windows"
2555
+ ],
2556
+ "desc": "List disks/partitions/filesystems",
2557
+ "executable": true
2558
+ },
2559
+ "list_pci": {
2560
+ "slots": [],
2561
+ "optional": [],
2562
+ "risk": "safe",
2563
+ "needs_sudo": false,
2564
+ "platforms": [
2565
+ "pi"
2566
+ ],
2567
+ "desc": "list pci devices",
2568
+ "executable": true
2569
+ },
2570
+ "list_printers": {
2571
+ "slots": [],
2572
+ "optional": [],
2573
+ "risk": "safe",
2574
+ "needs_sudo": false,
2575
+ "platforms": [
2576
+ "pi",
2577
+ "windows"
2578
+ ],
2579
+ "desc": "List printers",
2580
+ "executable": true
2581
+ },
2582
+ "list_processes": {
2583
+ "slots": [],
2584
+ "optional": [],
2585
+ "risk": "safe",
2586
+ "needs_sudo": false,
2587
+ "platforms": [
2588
+ "pi",
2589
+ "windows"
2590
+ ],
2591
+ "desc": "list running processes",
2592
+ "executable": true
2593
+ },
2594
+ "list_serial_ports": {
2595
+ "slots": [],
2596
+ "optional": [],
2597
+ "risk": "safe",
2598
+ "needs_sudo": false,
2599
+ "platforms": [
2600
+ "pi"
2601
+ ],
2602
+ "desc": "List serial/UART ports",
2603
+ "executable": true
2604
+ },
2605
+ "list_services": {
2606
+ "slots": [],
2607
+ "optional": [],
2608
+ "risk": "safe",
2609
+ "needs_sudo": false,
2610
+ "platforms": [
2611
+ "pi",
2612
+ "windows"
2613
+ ],
2614
+ "desc": "list services",
2615
+ "executable": true
2616
+ },
2617
+ "list_sessions": {
2618
+ "slots": [],
2619
+ "optional": [],
2620
+ "risk": "safe",
2621
+ "needs_sudo": false,
2622
+ "platforms": [
2623
+ "pi",
2624
+ "windows"
2625
+ ],
2626
+ "desc": "List sessions",
2627
+ "executable": true
2628
+ },
2629
+ "list_spi_devices": {
2630
+ "slots": [],
2631
+ "optional": [],
2632
+ "risk": "safe",
2633
+ "needs_sudo": false,
2634
+ "platforms": [
2635
+ "pi"
2636
+ ],
2637
+ "desc": "List SPI devices",
2638
+ "executable": true
2639
+ },
2640
+ "list_usb": {
2641
+ "slots": [],
2642
+ "optional": [],
2643
+ "risk": "safe",
2644
+ "needs_sudo": false,
2645
+ "platforms": [
2646
+ "pi"
2647
+ ],
2648
+ "desc": "list usb devices",
2649
+ "executable": true
2650
+ },
2651
+ "list_wifi": {
2652
+ "slots": [],
2653
+ "optional": [],
2654
+ "risk": "safe",
2655
+ "needs_sudo": false,
2656
+ "platforms": [
2657
+ "pi",
2658
+ "windows"
2659
+ ],
2660
+ "desc": "List available Wi-Fi networks",
2661
+ "executable": true
2662
+ },
2663
+ "load_overlay": {
2664
+ "slots": [
2665
+ "overlay"
2666
+ ],
2667
+ "optional": [],
2668
+ "risk": "caution",
2669
+ "needs_sudo": true,
2670
+ "platforms": [
2671
+ "pi"
2672
+ ],
2673
+ "desc": "Load a device-tree overlay",
2674
+ "executable": true
2675
+ },
2676
+ "lock_screen": {
2677
+ "slots": [],
2678
+ "optional": [],
2679
+ "risk": "caution",
2680
+ "needs_sudo": false,
2681
+ "platforms": [
2682
+ "pi",
2683
+ "windows"
2684
+ ],
2685
+ "desc": "Lock the screen",
2686
+ "executable": true
2687
+ },
2688
+ "magnifier_off": {
2689
+ "slots": [],
2690
+ "optional": [],
2691
+ "risk": "safe",
2692
+ "needs_sudo": false,
2693
+ "platforms": [
2694
+ "pi",
2695
+ "windows"
2696
+ ],
2697
+ "desc": "Close magnifier",
2698
+ "executable": true
2699
+ },
2700
+ "magnifier_on": {
2701
+ "slots": [],
2702
+ "optional": [],
2703
+ "risk": "safe",
2704
+ "needs_sudo": false,
2705
+ "platforms": [
2706
+ "pi",
2707
+ "windows"
2708
+ ],
2709
+ "desc": "Open magnifier",
2710
+ "executable": true
2711
+ },
2712
+ "manage_users": {
2713
+ "slots": [],
2714
+ "optional": [
2715
+ "user"
2716
+ ],
2717
+ "risk": "critical",
2718
+ "needs_sudo": true,
2719
+ "platforms": [
2720
+ "pi",
2721
+ "windows"
2722
+ ],
2723
+ "desc": "Add/remove/modify a user or sudo access",
2724
+ "executable": true
2725
+ },
2726
+ "maximize_window": {
2727
+ "slots": [],
2728
+ "optional": [],
2729
+ "risk": "safe",
2730
+ "needs_sudo": false,
2731
+ "platforms": [
2732
+ "pi",
2733
+ "windows"
2734
+ ],
2735
+ "desc": "Maximize current window",
2736
+ "executable": true
2737
+ },
2738
+ "media_next": {
2739
+ "slots": [],
2740
+ "optional": [],
2741
+ "risk": "safe",
2742
+ "needs_sudo": false,
2743
+ "platforms": [
2744
+ "pi",
2745
+ "windows"
2746
+ ],
2747
+ "desc": "Next track / video",
2748
+ "executable": true
2749
+ },
2750
+ "media_pause": {
2751
+ "slots": [],
2752
+ "optional": [],
2753
+ "risk": "safe",
2754
+ "needs_sudo": false,
2755
+ "platforms": [
2756
+ "pi",
2757
+ "windows"
2758
+ ],
2759
+ "desc": "Pause / stop media",
2760
+ "executable": true
2761
+ },
2762
+ "media_play": {
2763
+ "slots": [],
2764
+ "optional": [],
2765
+ "risk": "safe",
2766
+ "needs_sudo": false,
2767
+ "platforms": [
2768
+ "pi",
2769
+ "windows"
2770
+ ],
2771
+ "desc": "Play / resume media",
2772
+ "executable": true
2773
+ },
2774
+ "media_play_pause": {
2775
+ "slots": [],
2776
+ "optional": [],
2777
+ "risk": "safe",
2778
+ "needs_sudo": false,
2779
+ "platforms": [
2780
+ "pi",
2781
+ "windows"
2782
+ ],
2783
+ "desc": "play pause media",
2784
+ "executable": true
2785
+ },
2786
+ "media_prev": {
2787
+ "slots": [],
2788
+ "optional": [],
2789
+ "risk": "safe",
2790
+ "needs_sudo": false,
2791
+ "platforms": [
2792
+ "pi",
2793
+ "windows"
2794
+ ],
2795
+ "desc": "Previous track / video",
2796
+ "executable": true
2797
+ },
2798
+ "mic_mute": {
2799
+ "slots": [],
2800
+ "optional": [],
2801
+ "risk": "safe",
2802
+ "needs_sudo": false,
2803
+ "platforms": [
2804
+ "pi",
2805
+ "windows"
2806
+ ],
2807
+ "desc": "Mute microphone",
2808
+ "executable": true
2809
+ },
2810
+ "mic_unmute": {
2811
+ "slots": [],
2812
+ "optional": [],
2813
+ "risk": "safe",
2814
+ "needs_sudo": false,
2815
+ "platforms": [
2816
+ "pi",
2817
+ "windows"
2818
+ ],
2819
+ "desc": "Unmute microphone",
2820
+ "executable": true
2821
+ },
2822
+ "minimize_window": {
2823
+ "slots": [],
2824
+ "optional": [],
2825
+ "risk": "safe",
2826
+ "needs_sudo": false,
2827
+ "platforms": [
2828
+ "pi",
2829
+ "windows"
2830
+ ],
2831
+ "desc": "Minimize current window",
2832
+ "executable": true
2833
+ },
2834
+ "monitor_health": {
2835
+ "slots": [],
2836
+ "optional": [],
2837
+ "risk": "safe",
2838
+ "needs_sudo": false,
2839
+ "platforms": [
2840
+ "pi",
2841
+ "windows"
2842
+ ],
2843
+ "desc": "Live temp/clock/throttle monitor",
2844
+ "executable": true
2845
+ },
2846
+ "monitor_hotplug": {
2847
+ "slots": [],
2848
+ "optional": [],
2849
+ "risk": "safe",
2850
+ "needs_sudo": false,
2851
+ "platforms": [
2852
+ "pi",
2853
+ "windows"
2854
+ ],
2855
+ "desc": "Watch udev hotplug events",
2856
+ "executable": true
2857
+ },
2858
+ "mount_drive": {
2859
+ "slots": [
2860
+ "device"
2861
+ ],
2862
+ "optional": [],
2863
+ "risk": "caution",
2864
+ "needs_sudo": true,
2865
+ "platforms": [
2866
+ "pi",
2867
+ "windows"
2868
+ ],
2869
+ "desc": "Mount a drive",
2870
+ "executable": true
2871
+ },
2872
+ "move_file": {
2873
+ "slots": [
2874
+ "src",
2875
+ "dst"
2876
+ ],
2877
+ "optional": [],
2878
+ "risk": "caution",
2879
+ "needs_sudo": false,
2880
+ "platforms": [
2881
+ "pi",
2882
+ "windows"
2883
+ ],
2884
+ "desc": "move file \"{src}\" to \"{dst}\"",
2885
+ "executable": true
2886
+ },
2887
+ "mute": {
2888
+ "slots": [],
2889
+ "optional": [],
2890
+ "risk": "safe",
2891
+ "needs_sudo": false,
2892
+ "platforms": [
2893
+ "pi",
2894
+ "windows"
2895
+ ],
2896
+ "desc": "Mute audio",
2897
+ "executable": true
2898
+ },
2899
+ "narrator_off": {
2900
+ "slots": [],
2901
+ "optional": [],
2902
+ "risk": "safe",
2903
+ "needs_sudo": false,
2904
+ "platforms": [
2905
+ "pi",
2906
+ "windows"
2907
+ ],
2908
+ "desc": "Turn narrator / screen reader off",
2909
+ "executable": true
2910
+ },
2911
+ "narrator_on": {
2912
+ "slots": [],
2913
+ "optional": [],
2914
+ "risk": "safe",
2915
+ "needs_sudo": false,
2916
+ "platforms": [
2917
+ "pi",
2918
+ "windows"
2919
+ ],
2920
+ "desc": "Turn narrator / screen reader on",
2921
+ "executable": true
2922
+ },
2923
+ "network_status": {
2924
+ "slots": [],
2925
+ "optional": [],
2926
+ "risk": "safe",
2927
+ "needs_sudo": false,
2928
+ "platforms": [
2929
+ "pi",
2930
+ "windows"
2931
+ ],
2932
+ "desc": "Is internet connected? Show connection status",
2933
+ "executable": true
2934
+ },
2935
+ "new_tab": {
2936
+ "slots": [],
2937
+ "optional": [],
2938
+ "risk": "safe",
2939
+ "needs_sudo": false,
2940
+ "platforms": [
2941
+ "pi",
2942
+ "windows"
2943
+ ],
2944
+ "desc": "Open a new browser tab",
2945
+ "executable": true
2946
+ },
2947
+ "new_virtual_desktop": {
2948
+ "slots": [],
2949
+ "optional": [],
2950
+ "risk": "safe",
2951
+ "needs_sudo": false,
2952
+ "platforms": [
2953
+ "pi",
2954
+ "windows"
2955
+ ],
2956
+ "desc": "New virtual desktop",
2957
+ "executable": true
2958
+ },
2959
+ "next_tab": {
2960
+ "slots": [],
2961
+ "optional": [],
2962
+ "risk": "safe",
2963
+ "needs_sudo": false,
2964
+ "platforms": [
2965
+ "pi",
2966
+ "windows"
2967
+ ],
2968
+ "desc": "Next tab",
2969
+ "executable": true
2970
+ },
2971
+ "night_light_off": {
2972
+ "slots": [],
2973
+ "optional": [],
2974
+ "risk": "safe",
2975
+ "needs_sudo": false,
2976
+ "platforms": [
2977
+ "pi",
2978
+ "windows"
2979
+ ],
2980
+ "desc": "Turn off night light",
2981
+ "executable": true
2982
+ },
2983
+ "night_light_on": {
2984
+ "slots": [],
2985
+ "optional": [],
2986
+ "risk": "safe",
2987
+ "needs_sudo": false,
2988
+ "platforms": [
2989
+ "pi",
2990
+ "windows"
2991
+ ],
2992
+ "desc": "Turn on night light / blue light filter",
2993
+ "executable": true
2994
+ },
2995
+ "onscreen_keyboard": {
2996
+ "slots": [],
2997
+ "optional": [],
2998
+ "risk": "safe",
2999
+ "needs_sudo": false,
3000
+ "platforms": [
3001
+ "pi",
3002
+ "windows"
3003
+ ],
3004
+ "desc": "Open on-screen keyboard",
3005
+ "executable": true
3006
+ },
3007
+ "open_app": {
3008
+ "slots": [
3009
+ "app"
3010
+ ],
3011
+ "optional": [],
3012
+ "risk": "caution",
3013
+ "needs_sudo": false,
3014
+ "platforms": [
3015
+ "pi",
3016
+ "windows"
3017
+ ],
3018
+ "desc": "Open / launch an application",
3019
+ "executable": true
3020
+ },
3021
+ "open_config_tool": {
3022
+ "slots": [],
3023
+ "optional": [],
3024
+ "risk": "caution",
3025
+ "needs_sudo": false,
3026
+ "platforms": [
3027
+ "pi"
3028
+ ],
3029
+ "desc": "Open raspi-config",
3030
+ "executable": true
3031
+ },
3032
+ "open_file": {
3033
+ "slots": [
3034
+ "path"
3035
+ ],
3036
+ "optional": [],
3037
+ "risk": "safe",
3038
+ "needs_sudo": false,
3039
+ "platforms": [
3040
+ "pi",
3041
+ "windows"
3042
+ ],
3043
+ "desc": "Open a file by name",
3044
+ "executable": true
3045
+ },
3046
+ "open_folder": {
3047
+ "slots": [
3048
+ "folder"
3049
+ ],
3050
+ "optional": [],
3051
+ "risk": "safe",
3052
+ "needs_sudo": false,
3053
+ "platforms": [
3054
+ "pi",
3055
+ "windows"
3056
+ ],
3057
+ "desc": "Open a well-known folder",
3058
+ "executable": true
3059
+ },
3060
+ "open_notification_center": {
3061
+ "slots": [],
3062
+ "optional": [],
3063
+ "risk": "safe",
3064
+ "needs_sudo": false,
3065
+ "platforms": [
3066
+ "pi",
3067
+ "windows"
3068
+ ],
3069
+ "desc": "Open notification centre",
3070
+ "executable": true
3071
+ },
3072
+ "open_recycle_bin": {
3073
+ "slots": [],
3074
+ "optional": [],
3075
+ "risk": "safe",
3076
+ "needs_sudo": false,
3077
+ "platforms": [
3078
+ "pi",
3079
+ "windows"
3080
+ ],
3081
+ "desc": "Open recycle bin / trash",
3082
+ "executable": true
3083
+ },
3084
+ "open_serial_terminal": {
3085
+ "slots": [
3086
+ "serial_port"
3087
+ ],
3088
+ "optional": [
3089
+ "baud"
3090
+ ],
3091
+ "risk": "caution",
3092
+ "needs_sudo": false,
3093
+ "platforms": [
3094
+ "pi"
3095
+ ],
3096
+ "desc": "Open a serial console",
3097
+ "executable": true
3098
+ },
3099
+ "open_settings": {
3100
+ "slots": [],
3101
+ "optional": [
3102
+ "page"
3103
+ ],
3104
+ "risk": "safe",
3105
+ "needs_sudo": false,
3106
+ "platforms": [
3107
+ "pi",
3108
+ "windows"
3109
+ ],
3110
+ "desc": "Open settings (optionally a specific page)",
3111
+ "executable": true
3112
+ },
3113
+ "open_site": {
3114
+ "slots": [
3115
+ "site"
3116
+ ],
3117
+ "optional": [],
3118
+ "risk": "safe",
3119
+ "needs_sudo": false,
3120
+ "platforms": [
3121
+ "pi",
3122
+ "windows"
3123
+ ],
3124
+ "desc": "Open a known website",
3125
+ "executable": true
3126
+ },
3127
+ "open_url": {
3128
+ "slots": [
3129
+ "url"
3130
+ ],
3131
+ "optional": [],
3132
+ "risk": "safe",
3133
+ "needs_sudo": false,
3134
+ "platforms": [
3135
+ "pi",
3136
+ "windows"
3137
+ ],
3138
+ "desc": "Open an arbitrary URL / domain the user typed",
3139
+ "executable": true
3140
+ },
3141
+ "packet_capture": {
3142
+ "slots": [],
3143
+ "optional": [
3144
+ "iface"
3145
+ ],
3146
+ "risk": "caution",
3147
+ "needs_sudo": true,
3148
+ "platforms": [
3149
+ "pi",
3150
+ "windows"
3151
+ ],
3152
+ "desc": "Capture packets on an interface",
3153
+ "executable": true
3154
+ },
3155
+ "partition_disk": {
3156
+ "slots": [],
3157
+ "optional": [
3158
+ "device"
3159
+ ],
3160
+ "risk": "critical",
3161
+ "needs_sudo": true,
3162
+ "platforms": [
3163
+ "pi",
3164
+ "windows"
3165
+ ],
3166
+ "desc": "Partition or format a disk",
3167
+ "executable": true
3168
+ },
3169
+ "paste": {
3170
+ "slots": [],
3171
+ "optional": [],
3172
+ "risk": "safe",
3173
+ "needs_sudo": false,
3174
+ "platforms": [
3175
+ "pi",
3176
+ "windows"
3177
+ ],
3178
+ "desc": "Paste (Ctrl+V)",
3179
+ "executable": true
3180
+ },
3181
+ "ping": {
3182
+ "slots": [
3183
+ "host"
3184
+ ],
3185
+ "optional": [],
3186
+ "risk": "safe",
3187
+ "needs_sudo": false,
3188
+ "platforms": [
3189
+ "pi",
3190
+ "windows"
3191
+ ],
3192
+ "desc": "Ping a host",
3193
+ "executable": true
3194
+ },
3195
+ "port_forward": {
3196
+ "slots": [
3197
+ "port"
3198
+ ],
3199
+ "optional": [
3200
+ "host"
3201
+ ],
3202
+ "risk": "caution",
3203
+ "needs_sudo": false,
3204
+ "platforms": [
3205
+ "pi",
3206
+ "windows"
3207
+ ],
3208
+ "desc": "SSH port-forward",
3209
+ "executable": true
3210
+ },
3211
+ "power_mode": {
3212
+ "slots": [
3213
+ "mode"
3214
+ ],
3215
+ "optional": [],
3216
+ "risk": "caution",
3217
+ "needs_sudo": false,
3218
+ "platforms": [
3219
+ "pi",
3220
+ "windows"
3221
+ ],
3222
+ "desc": "Power plan: performance / balanced",
3223
+ "executable": true
3224
+ },
3225
+ "press_key": {
3226
+ "slots": [
3227
+ "key"
3228
+ ],
3229
+ "optional": [],
3230
+ "risk": "caution",
3231
+ "needs_sudo": false,
3232
+ "platforms": [
3233
+ "pi",
3234
+ "windows"
3235
+ ],
3236
+ "desc": "Press a single named key",
3237
+ "executable": true
3238
+ },
3239
+ "prev_tab": {
3240
+ "slots": [],
3241
+ "optional": [],
3242
+ "risk": "safe",
3243
+ "needs_sudo": false,
3244
+ "platforms": [
3245
+ "pi",
3246
+ "windows"
3247
+ ],
3248
+ "desc": "Previous tab",
3249
+ "executable": true
3250
+ },
3251
+ "print_file": {
3252
+ "slots": [
3253
+ "path"
3254
+ ],
3255
+ "optional": [],
3256
+ "risk": "caution",
3257
+ "needs_sudo": false,
3258
+ "platforms": [
3259
+ "pi",
3260
+ "windows"
3261
+ ],
3262
+ "desc": "Print a file",
3263
+ "executable": true
3264
+ },
3265
+ "print_page": {
3266
+ "slots": [],
3267
+ "optional": [],
3268
+ "risk": "safe",
3269
+ "needs_sudo": false,
3270
+ "platforms": [
3271
+ "pi",
3272
+ "windows"
3273
+ ],
3274
+ "desc": "Print (Ctrl+P)",
3275
+ "executable": true
3276
+ },
3277
+ "pull_llm_model": {
3278
+ "slots": [
3279
+ "model"
3280
+ ],
3281
+ "optional": [],
3282
+ "risk": "caution",
3283
+ "needs_sudo": false,
3284
+ "platforms": [
3285
+ "pi",
3286
+ "windows"
3287
+ ],
3288
+ "desc": "Download an LLM model",
3289
+ "executable": true
3290
+ },
3291
+ "read_file": {
3292
+ "slots": [
3293
+ "path"
3294
+ ],
3295
+ "optional": [],
3296
+ "risk": "caution",
3297
+ "needs_sudo": false,
3298
+ "platforms": [
3299
+ "pi",
3300
+ "windows"
3301
+ ],
3302
+ "desc": "read file \"{path}\"",
3303
+ "executable": true
3304
+ },
3305
+ "recent_files": {
3306
+ "slots": [],
3307
+ "optional": [],
3308
+ "risk": "safe",
3309
+ "needs_sudo": false,
3310
+ "platforms": [
3311
+ "pi",
3312
+ "windows"
3313
+ ],
3314
+ "desc": "Show recent files",
3315
+ "executable": true
3316
+ },
3317
+ "record_audio": {
3318
+ "slots": [
3319
+ "amount",
3320
+ "unit"
3321
+ ],
3322
+ "optional": [],
3323
+ "risk": "safe",
3324
+ "needs_sudo": false,
3325
+ "platforms": [
3326
+ "pi",
3327
+ "windows"
3328
+ ],
3329
+ "desc": "Record audio from the mic for a duration",
3330
+ "executable": true
3331
+ },
3332
+ "redo": {
3333
+ "slots": [],
3334
+ "optional": [],
3335
+ "risk": "safe",
3336
+ "needs_sudo": false,
3337
+ "platforms": [
3338
+ "pi",
3339
+ "windows"
3340
+ ],
3341
+ "desc": "Redo (Ctrl+Y)",
3342
+ "executable": true
3343
+ },
3344
+ "refresh": {
3345
+ "slots": [],
3346
+ "optional": [],
3347
+ "risk": "safe",
3348
+ "needs_sudo": false,
3349
+ "platforms": [
3350
+ "pi",
3351
+ "windows"
3352
+ ],
3353
+ "desc": "Refresh / reload page",
3354
+ "executable": true
3355
+ },
3356
+ "remote_shell": {
3357
+ "slots": [
3358
+ "host"
3359
+ ],
3360
+ "optional": [
3361
+ "user"
3362
+ ],
3363
+ "risk": "caution",
3364
+ "needs_sudo": false,
3365
+ "platforms": [
3366
+ "pi",
3367
+ "windows"
3368
+ ],
3369
+ "desc": "Open an SSH shell to a host",
3370
+ "executable": true
3371
+ },
3372
+ "rename_file": {
3373
+ "slots": [
3374
+ "src",
3375
+ "dst"
3376
+ ],
3377
+ "optional": [],
3378
+ "risk": "caution",
3379
+ "needs_sudo": false,
3380
+ "platforms": [
3381
+ "pi",
3382
+ "windows"
3383
+ ],
3384
+ "desc": "rename file \"{src}\" to \"{dst}\"",
3385
+ "executable": true
3386
+ },
3387
+ "reopen_tab": {
3388
+ "slots": [],
3389
+ "optional": [],
3390
+ "risk": "safe",
3391
+ "needs_sudo": false,
3392
+ "platforms": [
3393
+ "pi",
3394
+ "windows"
3395
+ ],
3396
+ "desc": "Reopen last closed tab",
3397
+ "executable": true
3398
+ },
3399
+ "repair_packages": {
3400
+ "slots": [],
3401
+ "optional": [],
3402
+ "risk": "caution",
3403
+ "needs_sudo": true,
3404
+ "platforms": [
3405
+ "pi",
3406
+ "windows"
3407
+ ],
3408
+ "desc": "Fix broken package state",
3409
+ "executable": true
3410
+ },
3411
+ "repeat_last": {
3412
+ "slots": [],
3413
+ "optional": [],
3414
+ "risk": "safe",
3415
+ "needs_sudo": false,
3416
+ "platforms": [
3417
+ "pi",
3418
+ "windows"
3419
+ ],
3420
+ "desc": "Repeat the previous command",
3421
+ "executable": true
3422
+ },
3423
+ "restart": {
3424
+ "slots": [],
3425
+ "optional": [
3426
+ "amount",
3427
+ "unit",
3428
+ "at"
3429
+ ],
3430
+ "risk": "critical",
3431
+ "needs_sudo": true,
3432
+ "platforms": [
3433
+ "pi",
3434
+ "windows"
3435
+ ],
3436
+ "desc": "Restart / reboot (optional delay)",
3437
+ "executable": true
3438
+ },
3439
+ "rotate_screen": {
3440
+ "slots": [
3441
+ "orientation"
3442
+ ],
3443
+ "optional": [],
3444
+ "risk": "safe",
3445
+ "needs_sudo": false,
3446
+ "platforms": [
3447
+ "pi",
3448
+ "windows"
3449
+ ],
3450
+ "desc": "Set display orientation",
3451
+ "executable": true
3452
+ },
3453
+ "run_background": {
3454
+ "slots": [
3455
+ "command"
3456
+ ],
3457
+ "optional": [],
3458
+ "risk": "critical",
3459
+ "needs_sudo": false,
3460
+ "platforms": [
3461
+ "pi",
3462
+ "windows"
3463
+ ],
3464
+ "desc": "Run a command detached",
3465
+ "executable": true
3466
+ },
3467
+ "run_benchmark": {
3468
+ "slots": [
3469
+ "target"
3470
+ ],
3471
+ "optional": [],
3472
+ "risk": "caution",
3473
+ "needs_sudo": false,
3474
+ "platforms": [
3475
+ "pi",
3476
+ "windows"
3477
+ ],
3478
+ "desc": "Run a cpu/memory/disk benchmark",
3479
+ "executable": true
3480
+ },
3481
+ "run_command": {
3482
+ "slots": [
3483
+ "command"
3484
+ ],
3485
+ "optional": [],
3486
+ "risk": "critical",
3487
+ "needs_sudo": false,
3488
+ "platforms": [
3489
+ "pi",
3490
+ "windows"
3491
+ ],
3492
+ "desc": "Run an arbitrary shell command",
3493
+ "executable": true
3494
+ },
3495
+ "run_llm": {
3496
+ "slots": [
3497
+ "model"
3498
+ ],
3499
+ "optional": [],
3500
+ "risk": "caution",
3501
+ "needs_sudo": false,
3502
+ "platforms": [
3503
+ "pi",
3504
+ "windows"
3505
+ ],
3506
+ "desc": "Run a local LLM",
3507
+ "executable": true
3508
+ },
3509
+ "run_llm_benchmark": {
3510
+ "slots": [
3511
+ "model"
3512
+ ],
3513
+ "optional": [],
3514
+ "risk": "safe",
3515
+ "needs_sudo": false,
3516
+ "platforms": [
3517
+ "pi",
3518
+ "windows"
3519
+ ],
3520
+ "desc": "Benchmark an LLM",
3521
+ "executable": true
3522
+ },
3523
+ "run_network_benchmark": {
3524
+ "slots": [
3525
+ "host"
3526
+ ],
3527
+ "optional": [],
3528
+ "risk": "caution",
3529
+ "needs_sudo": false,
3530
+ "platforms": [
3531
+ "pi",
3532
+ "windows"
3533
+ ],
3534
+ "desc": "iperf LAN throughput test",
3535
+ "executable": true
3536
+ },
3537
+ "run_script": {
3538
+ "slots": [],
3539
+ "optional": [],
3540
+ "risk": "critical",
3541
+ "needs_sudo": true,
3542
+ "platforms": [
3543
+ "pi",
3544
+ "windows"
3545
+ ],
3546
+ "desc": "run shell script",
3547
+ "executable": true
3548
+ },
3549
+ "run_stress_test": {
3550
+ "slots": [
3551
+ "amount",
3552
+ "unit"
3553
+ ],
3554
+ "optional": [],
3555
+ "risk": "caution",
3556
+ "needs_sudo": false,
3557
+ "platforms": [
3558
+ "pi",
3559
+ "windows"
3560
+ ],
3561
+ "desc": "Stress-test the CPU for a duration",
3562
+ "executable": true
3563
+ },
3564
+ "save_file": {
3565
+ "slots": [],
3566
+ "optional": [],
3567
+ "risk": "safe",
3568
+ "needs_sudo": false,
3569
+ "platforms": [
3570
+ "pi",
3571
+ "windows"
3572
+ ],
3573
+ "desc": "Save current file (Ctrl+S)",
3574
+ "executable": true
3575
+ },
3576
+ "scan_lan": {
3577
+ "slots": [],
3578
+ "optional": [],
3579
+ "risk": "caution",
3580
+ "needs_sudo": false,
3581
+ "platforms": [
3582
+ "pi",
3583
+ "windows"
3584
+ ],
3585
+ "desc": "Scan the LAN for devices",
3586
+ "executable": true
3587
+ },
3588
+ "scan_ports": {
3589
+ "slots": [
3590
+ "host"
3591
+ ],
3592
+ "optional": [],
3593
+ "risk": "caution",
3594
+ "needs_sudo": false,
3595
+ "platforms": [
3596
+ "pi",
3597
+ "windows"
3598
+ ],
3599
+ "desc": "Port-scan a host",
3600
+ "executable": true
3601
+ },
3602
+ "schedule_task": {
3603
+ "slots": [
3604
+ "command",
3605
+ "schedule"
3606
+ ],
3607
+ "optional": [],
3608
+ "risk": "critical",
3609
+ "needs_sudo": false,
3610
+ "platforms": [
3611
+ "pi",
3612
+ "windows"
3613
+ ],
3614
+ "desc": "Schedule a command (cron)",
3615
+ "executable": true
3616
+ },
3617
+ "screen_off": {
3618
+ "slots": [],
3619
+ "optional": [],
3620
+ "risk": "safe",
3621
+ "needs_sudo": false,
3622
+ "platforms": [
3623
+ "pi",
3624
+ "windows"
3625
+ ],
3626
+ "desc": "Turn the display off (system keeps running)",
3627
+ "executable": true
3628
+ },
3629
+ "screen_record_start": {
3630
+ "slots": [],
3631
+ "optional": [],
3632
+ "risk": "safe",
3633
+ "needs_sudo": false,
3634
+ "platforms": [
3635
+ "pi",
3636
+ "windows"
3637
+ ],
3638
+ "desc": "Start screen recording",
3639
+ "executable": true
3640
+ },
3641
+ "screen_record_stop": {
3642
+ "slots": [],
3643
+ "optional": [],
3644
+ "risk": "safe",
3645
+ "needs_sudo": false,
3646
+ "platforms": [
3647
+ "pi",
3648
+ "windows"
3649
+ ],
3650
+ "desc": "Stop screen recording",
3651
+ "executable": true
3652
+ },
3653
+ "screenshot": {
3654
+ "slots": [],
3655
+ "optional": [],
3656
+ "risk": "safe",
3657
+ "needs_sudo": false,
3658
+ "platforms": [
3659
+ "pi",
3660
+ "windows"
3661
+ ],
3662
+ "desc": "Take a screenshot",
3663
+ "executable": true
3664
+ },
3665
+ "scroll_down": {
3666
+ "slots": [],
3667
+ "optional": [],
3668
+ "risk": "safe",
3669
+ "needs_sudo": false,
3670
+ "platforms": [
3671
+ "pi",
3672
+ "windows"
3673
+ ],
3674
+ "desc": "Scroll down",
3675
+ "executable": true
3676
+ },
3677
+ "scroll_up": {
3678
+ "slots": [],
3679
+ "optional": [],
3680
+ "risk": "safe",
3681
+ "needs_sudo": false,
3682
+ "platforms": [
3683
+ "pi",
3684
+ "windows"
3685
+ ],
3686
+ "desc": "Scroll up",
3687
+ "executable": true
3688
+ },
3689
+ "search_files": {
3690
+ "slots": [
3691
+ "query"
3692
+ ],
3693
+ "optional": [],
3694
+ "risk": "safe",
3695
+ "needs_sudo": false,
3696
+ "platforms": [
3697
+ "pi",
3698
+ "windows"
3699
+ ],
3700
+ "desc": "Search files by name",
3701
+ "executable": true
3702
+ },
3703
+ "search_in_files": {
3704
+ "slots": [
3705
+ "query"
3706
+ ],
3707
+ "optional": [],
3708
+ "risk": "safe",
3709
+ "needs_sudo": false,
3710
+ "platforms": [
3711
+ "pi",
3712
+ "windows"
3713
+ ],
3714
+ "desc": "Search text inside files",
3715
+ "executable": true
3716
+ },
3717
+ "search_package": {
3718
+ "slots": [
3719
+ "name"
3720
+ ],
3721
+ "optional": [],
3722
+ "risk": "safe",
3723
+ "needs_sudo": false,
3724
+ "platforms": [
3725
+ "pi",
3726
+ "windows"
3727
+ ],
3728
+ "desc": "Search available packages",
3729
+ "executable": true
3730
+ },
3731
+ "select_all": {
3732
+ "slots": [],
3733
+ "optional": [],
3734
+ "risk": "safe",
3735
+ "needs_sudo": false,
3736
+ "platforms": [
3737
+ "pi",
3738
+ "windows"
3739
+ ],
3740
+ "desc": "Select all (Ctrl+A)",
3741
+ "executable": true
3742
+ },
3743
+ "send_email": {
3744
+ "slots": [
3745
+ "to",
3746
+ "text"
3747
+ ],
3748
+ "optional": [
3749
+ "subject"
3750
+ ],
3751
+ "risk": "caution",
3752
+ "needs_sudo": false,
3753
+ "platforms": [
3754
+ "pi",
3755
+ "windows"
3756
+ ],
3757
+ "desc": "Send an email",
3758
+ "executable": true
3759
+ },
3760
+ "send_message": {
3761
+ "slots": [
3762
+ "app",
3763
+ "contact",
3764
+ "text"
3765
+ ],
3766
+ "optional": [],
3767
+ "risk": "caution",
3768
+ "needs_sudo": false,
3769
+ "platforms": [
3770
+ "pi",
3771
+ "windows"
3772
+ ],
3773
+ "desc": "Send a chat/SMS message to a contact",
3774
+ "executable": true
3775
+ },
3776
+ "service_disable": {
3777
+ "slots": [
3778
+ "service"
3779
+ ],
3780
+ "optional": [],
3781
+ "risk": "critical",
3782
+ "needs_sudo": true,
3783
+ "platforms": [
3784
+ "pi",
3785
+ "windows"
3786
+ ],
3787
+ "desc": "Disable a service at boot (and stop)",
3788
+ "executable": true
3789
+ },
3790
+ "service_enable": {
3791
+ "slots": [
3792
+ "service"
3793
+ ],
3794
+ "optional": [],
3795
+ "risk": "critical",
3796
+ "needs_sudo": true,
3797
+ "platforms": [
3798
+ "pi",
3799
+ "windows"
3800
+ ],
3801
+ "desc": "Enable a service at boot (and start)",
3802
+ "executable": true
3803
+ },
3804
+ "service_restart": {
3805
+ "slots": [
3806
+ "service"
3807
+ ],
3808
+ "optional": [],
3809
+ "risk": "critical",
3810
+ "needs_sudo": true,
3811
+ "platforms": [
3812
+ "pi",
3813
+ "windows"
3814
+ ],
3815
+ "desc": "Restart a system service",
3816
+ "executable": true
3817
+ },
3818
+ "service_start": {
3819
+ "slots": [
3820
+ "service"
3821
+ ],
3822
+ "optional": [],
3823
+ "risk": "critical",
3824
+ "needs_sudo": true,
3825
+ "platforms": [
3826
+ "pi",
3827
+ "windows"
3828
+ ],
3829
+ "desc": "Start a system service",
3830
+ "executable": true
3831
+ },
3832
+ "service_status": {
3833
+ "slots": [
3834
+ "service"
3835
+ ],
3836
+ "optional": [],
3837
+ "risk": "safe",
3838
+ "needs_sudo": false,
3839
+ "platforms": [
3840
+ "pi",
3841
+ "windows"
3842
+ ],
3843
+ "desc": "Show a service's status",
3844
+ "executable": true
3845
+ },
3846
+ "service_stop": {
3847
+ "slots": [
3848
+ "service"
3849
+ ],
3850
+ "optional": [],
3851
+ "risk": "critical",
3852
+ "needs_sudo": true,
3853
+ "platforms": [
3854
+ "pi",
3855
+ "windows"
3856
+ ],
3857
+ "desc": "Stop a system service",
3858
+ "executable": true
3859
+ },
3860
+ "set_alarm": {
3861
+ "slots": [
3862
+ "time"
3863
+ ],
3864
+ "optional": [],
3865
+ "risk": "safe",
3866
+ "needs_sudo": false,
3867
+ "platforms": [
3868
+ "pi",
3869
+ "windows"
3870
+ ],
3871
+ "desc": "Set alarm at clock time (time=HH:MM 24h)",
3872
+ "executable": true
3873
+ },
3874
+ "set_audio_output": {
3875
+ "slots": [
3876
+ "output"
3877
+ ],
3878
+ "optional": [],
3879
+ "risk": "safe",
3880
+ "needs_sudo": false,
3881
+ "platforms": [
3882
+ "pi",
3883
+ "windows"
3884
+ ],
3885
+ "desc": "Switch audio output device",
3886
+ "executable": true
3887
+ },
3888
+ "set_boot_order": {
3889
+ "slots": [],
3890
+ "optional": [
3891
+ "order"
3892
+ ],
3893
+ "risk": "critical",
3894
+ "needs_sudo": true,
3895
+ "platforms": [
3896
+ "pi"
3897
+ ],
3898
+ "desc": "Set bootloader boot order",
3899
+ "executable": true
3900
+ },
3901
+ "set_boot_target": {
3902
+ "slots": [
3903
+ "target"
3904
+ ],
3905
+ "optional": [],
3906
+ "risk": "caution",
3907
+ "needs_sudo": true,
3908
+ "platforms": [
3909
+ "pi",
3910
+ "windows"
3911
+ ],
3912
+ "desc": "Boot to desktop or console",
3913
+ "executable": true
3914
+ },
3915
+ "set_brightness": {
3916
+ "slots": [
3917
+ "value"
3918
+ ],
3919
+ "optional": [],
3920
+ "risk": "caution",
3921
+ "needs_sudo": false,
3922
+ "platforms": [
3923
+ "pi",
3924
+ "windows"
3925
+ ],
3926
+ "desc": "Set screen brightness percent",
3927
+ "executable": true
3928
+ },
3929
+ "set_cpu_affinity": {
3930
+ "slots": [
3931
+ "pid",
3932
+ "cores"
3933
+ ],
3934
+ "optional": [],
3935
+ "risk": "caution",
3936
+ "needs_sudo": false,
3937
+ "platforms": [
3938
+ "pi",
3939
+ "windows"
3940
+ ],
3941
+ "desc": "Pin a process to cores",
3942
+ "executable": true
3943
+ },
3944
+ "set_cpu_governor": {
3945
+ "slots": [
3946
+ "governor"
3947
+ ],
3948
+ "optional": [],
3949
+ "risk": "caution",
3950
+ "needs_sudo": true,
3951
+ "platforms": [
3952
+ "pi"
3953
+ ],
3954
+ "desc": "Set CPU frequency governor",
3955
+ "executable": true
3956
+ },
3957
+ "set_default_printer": {
3958
+ "slots": [
3959
+ "name"
3960
+ ],
3961
+ "optional": [],
3962
+ "risk": "safe",
3963
+ "needs_sudo": false,
3964
+ "platforms": [
3965
+ "pi",
3966
+ "windows"
3967
+ ],
3968
+ "desc": "Set default printer",
3969
+ "executable": true
3970
+ },
3971
+ "set_disk_label": {
3972
+ "slots": [
3973
+ "device",
3974
+ "label"
3975
+ ],
3976
+ "optional": [],
3977
+ "risk": "caution",
3978
+ "needs_sudo": true,
3979
+ "platforms": [
3980
+ "pi",
3981
+ "windows"
3982
+ ],
3983
+ "desc": "Set a volume label",
3984
+ "executable": true
3985
+ },
3986
+ "set_display_scale": {
3987
+ "slots": [
3988
+ "value"
3989
+ ],
3990
+ "optional": [],
3991
+ "risk": "safe",
3992
+ "needs_sudo": false,
3993
+ "platforms": [
3994
+ "pi",
3995
+ "windows"
3996
+ ],
3997
+ "desc": "Set display scaling percent",
3998
+ "executable": true
3999
+ },
4000
+ "set_keyboard_layout": {
4001
+ "slots": [
4002
+ "layout"
4003
+ ],
4004
+ "optional": [],
4005
+ "risk": "caution",
4006
+ "needs_sudo": true,
4007
+ "platforms": [
4008
+ "pi",
4009
+ "windows"
4010
+ ],
4011
+ "desc": "Set keyboard layout",
4012
+ "executable": true
4013
+ },
4014
+ "set_locale": {
4015
+ "slots": [
4016
+ "locale"
4017
+ ],
4018
+ "optional": [],
4019
+ "risk": "caution",
4020
+ "needs_sudo": true,
4021
+ "platforms": [
4022
+ "pi",
4023
+ "windows"
4024
+ ],
4025
+ "desc": "Set system locale",
4026
+ "executable": true
4027
+ },
4028
+ "set_mouse_speed": {
4029
+ "slots": [
4030
+ "value"
4031
+ ],
4032
+ "optional": [],
4033
+ "risk": "safe",
4034
+ "needs_sudo": false,
4035
+ "platforms": [
4036
+ "pi",
4037
+ "windows"
4038
+ ],
4039
+ "desc": "Set mouse/pointer speed",
4040
+ "executable": true
4041
+ },
4042
+ "set_owner": {
4043
+ "slots": [
4044
+ "path",
4045
+ "user"
4046
+ ],
4047
+ "optional": [],
4048
+ "risk": "critical",
4049
+ "needs_sudo": true,
4050
+ "platforms": [
4051
+ "pi",
4052
+ "windows"
4053
+ ],
4054
+ "desc": "Change file ownership",
4055
+ "executable": true
4056
+ },
4057
+ "set_permissions": {
4058
+ "slots": [
4059
+ "path"
4060
+ ],
4061
+ "optional": [],
4062
+ "risk": "critical",
4063
+ "needs_sudo": true,
4064
+ "platforms": [
4065
+ "pi",
4066
+ "windows"
4067
+ ],
4068
+ "desc": "Change file permissions",
4069
+ "executable": true
4070
+ },
4071
+ "set_process_priority": {
4072
+ "slots": [
4073
+ "pid"
4074
+ ],
4075
+ "optional": [
4076
+ "priority"
4077
+ ],
4078
+ "risk": "caution",
4079
+ "needs_sudo": false,
4080
+ "platforms": [
4081
+ "pi",
4082
+ "windows"
4083
+ ],
4084
+ "desc": "renice a process",
4085
+ "executable": true
4086
+ },
4087
+ "set_refresh_rate": {
4088
+ "slots": [
4089
+ "value"
4090
+ ],
4091
+ "optional": [],
4092
+ "risk": "caution",
4093
+ "needs_sudo": false,
4094
+ "platforms": [
4095
+ "pi",
4096
+ "windows"
4097
+ ],
4098
+ "desc": "Set monitor refresh rate (Hz)",
4099
+ "executable": true
4100
+ },
4101
+ "set_reminder": {
4102
+ "slots": [
4103
+ "amount",
4104
+ "text",
4105
+ "unit"
4106
+ ],
4107
+ "optional": [],
4108
+ "risk": "safe",
4109
+ "needs_sudo": false,
4110
+ "platforms": [
4111
+ "pi",
4112
+ "windows"
4113
+ ],
4114
+ "desc": "Reminder after a duration",
4115
+ "executable": true
4116
+ },
4117
+ "set_resolution": {
4118
+ "slots": [
4119
+ "resolution"
4120
+ ],
4121
+ "optional": [],
4122
+ "risk": "caution",
4123
+ "needs_sudo": false,
4124
+ "platforms": [
4125
+ "pi",
4126
+ "windows"
4127
+ ],
4128
+ "desc": "Set display resolution",
4129
+ "executable": true
4130
+ },
4131
+ "set_swap_size": {
4132
+ "slots": [
4133
+ "size"
4134
+ ],
4135
+ "optional": [],
4136
+ "risk": "critical",
4137
+ "needs_sudo": true,
4138
+ "platforms": [
4139
+ "pi",
4140
+ "windows"
4141
+ ],
4142
+ "desc": "Resize the swap file",
4143
+ "executable": true
4144
+ },
4145
+ "set_swappiness": {
4146
+ "slots": [
4147
+ "value"
4148
+ ],
4149
+ "optional": [],
4150
+ "risk": "caution",
4151
+ "needs_sudo": true,
4152
+ "platforms": [
4153
+ "pi",
4154
+ "windows"
4155
+ ],
4156
+ "desc": "Set vm.swappiness",
4157
+ "executable": true
4158
+ },
4159
+ "set_timer": {
4160
+ "slots": [
4161
+ "amount",
4162
+ "unit"
4163
+ ],
4164
+ "optional": [],
4165
+ "risk": "safe",
4166
+ "needs_sudo": false,
4167
+ "platforms": [
4168
+ "pi",
4169
+ "windows"
4170
+ ],
4171
+ "desc": "Set a countdown timer",
4172
+ "executable": true
4173
+ },
4174
+ "set_timezone": {
4175
+ "slots": [
4176
+ "tz"
4177
+ ],
4178
+ "optional": [],
4179
+ "risk": "caution",
4180
+ "needs_sudo": true,
4181
+ "platforms": [
4182
+ "pi",
4183
+ "windows"
4184
+ ],
4185
+ "desc": "Set the system timezone",
4186
+ "executable": true
4187
+ },
4188
+ "set_volume": {
4189
+ "slots": [
4190
+ "value"
4191
+ ],
4192
+ "optional": [],
4193
+ "risk": "safe",
4194
+ "needs_sudo": false,
4195
+ "platforms": [
4196
+ "pi",
4197
+ "windows"
4198
+ ],
4199
+ "desc": "Set master volume to an exact percent",
4200
+ "executable": true
4201
+ },
4202
+ "set_wallpaper": {
4203
+ "slots": [
4204
+ "path"
4205
+ ],
4206
+ "optional": [],
4207
+ "risk": "safe",
4208
+ "needs_sudo": false,
4209
+ "platforms": [
4210
+ "pi",
4211
+ "windows"
4212
+ ],
4213
+ "desc": "Set desktop wallpaper",
4214
+ "executable": true
4215
+ },
4216
+ "show_command_history": {
4217
+ "slots": [],
4218
+ "optional": [],
4219
+ "risk": "safe",
4220
+ "needs_sudo": false,
4221
+ "platforms": [
4222
+ "pi",
4223
+ "windows"
4224
+ ],
4225
+ "desc": "Show command history",
4226
+ "executable": true
4227
+ },
4228
+ "show_desktop": {
4229
+ "slots": [],
4230
+ "optional": [],
4231
+ "risk": "safe",
4232
+ "needs_sudo": false,
4233
+ "platforms": [
4234
+ "pi",
4235
+ "windows"
4236
+ ],
4237
+ "desc": "Minimize everything / show desktop",
4238
+ "executable": true
4239
+ },
4240
+ "show_pinout": {
4241
+ "slots": [],
4242
+ "optional": [],
4243
+ "risk": "safe",
4244
+ "needs_sudo": false,
4245
+ "platforms": [
4246
+ "pi"
4247
+ ],
4248
+ "desc": "Show GPIO pinout",
4249
+ "executable": true
4250
+ },
4251
+ "show_wifi_password": {
4252
+ "slots": [],
4253
+ "optional": [
4254
+ "ssid"
4255
+ ],
4256
+ "risk": "caution",
4257
+ "needs_sudo": false,
4258
+ "platforms": [
4259
+ "pi",
4260
+ "windows"
4261
+ ],
4262
+ "desc": "Show a saved Wi-Fi password",
4263
+ "executable": true
4264
+ },
4265
+ "shutdown": {
4266
+ "slots": [],
4267
+ "optional": [
4268
+ "amount",
4269
+ "unit",
4270
+ "at"
4271
+ ],
4272
+ "risk": "critical",
4273
+ "needs_sudo": true,
4274
+ "platforms": [
4275
+ "pi",
4276
+ "windows"
4277
+ ],
4278
+ "desc": "Shut down the machine (optional delay)",
4279
+ "executable": true
4280
+ },
4281
+ "sign_out": {
4282
+ "slots": [],
4283
+ "optional": [],
4284
+ "risk": "critical",
4285
+ "needs_sudo": false,
4286
+ "platforms": [
4287
+ "pi",
4288
+ "windows"
4289
+ ],
4290
+ "desc": "Sign out / log off the current user",
4291
+ "executable": true
4292
+ },
4293
+ "sleep": {
4294
+ "slots": [],
4295
+ "optional": [
4296
+ "amount",
4297
+ "unit"
4298
+ ],
4299
+ "risk": "critical",
4300
+ "needs_sudo": false,
4301
+ "platforms": [
4302
+ "pi",
4303
+ "windows"
4304
+ ],
4305
+ "desc": "Put the machine to sleep (optional delay)",
4306
+ "executable": true
4307
+ },
4308
+ "snap_left": {
4309
+ "slots": [],
4310
+ "optional": [],
4311
+ "risk": "safe",
4312
+ "needs_sudo": false,
4313
+ "platforms": [
4314
+ "pi",
4315
+ "windows"
4316
+ ],
4317
+ "desc": "Snap window to left half",
4318
+ "executable": true
4319
+ },
4320
+ "snap_right": {
4321
+ "slots": [],
4322
+ "optional": [],
4323
+ "risk": "safe",
4324
+ "needs_sudo": false,
4325
+ "platforms": [
4326
+ "pi",
4327
+ "windows"
4328
+ ],
4329
+ "desc": "Snap window to right half",
4330
+ "executable": true
4331
+ },
4332
+ "speed_test": {
4333
+ "slots": [],
4334
+ "optional": [],
4335
+ "risk": "safe",
4336
+ "needs_sudo": false,
4337
+ "platforms": [
4338
+ "pi",
4339
+ "windows"
4340
+ ],
4341
+ "desc": "Internet speed test",
4342
+ "executable": true
4343
+ },
4344
+ "start_session": {
4345
+ "slots": [
4346
+ "name"
4347
+ ],
4348
+ "optional": [],
4349
+ "risk": "safe",
4350
+ "needs_sudo": false,
4351
+ "platforms": [
4352
+ "pi",
4353
+ "windows"
4354
+ ],
4355
+ "desc": "Start a tmux/screen session",
4356
+ "executable": true
4357
+ },
4358
+ "stop_llm": {
4359
+ "slots": [],
4360
+ "optional": [],
4361
+ "risk": "caution",
4362
+ "needs_sudo": false,
4363
+ "platforms": [
4364
+ "pi",
4365
+ "windows"
4366
+ ],
4367
+ "desc": "Stop the local LLM",
4368
+ "executable": true
4369
+ },
4370
+ "stopwatch_start": {
4371
+ "slots": [],
4372
+ "optional": [],
4373
+ "risk": "safe",
4374
+ "needs_sudo": false,
4375
+ "platforms": [
4376
+ "pi",
4377
+ "windows"
4378
+ ],
4379
+ "desc": "Start stopwatch",
4380
+ "executable": true
4381
+ },
4382
+ "stopwatch_stop": {
4383
+ "slots": [],
4384
+ "optional": [],
4385
+ "risk": "safe",
4386
+ "needs_sudo": false,
4387
+ "platforms": [
4388
+ "pi",
4389
+ "windows"
4390
+ ],
4391
+ "desc": "Stop stopwatch",
4392
+ "executable": true
4393
+ },
4394
+ "switch_input_language": {
4395
+ "slots": [],
4396
+ "optional": [],
4397
+ "risk": "safe",
4398
+ "needs_sudo": false,
4399
+ "platforms": [
4400
+ "pi",
4401
+ "windows"
4402
+ ],
4403
+ "desc": "Switch keyboard layout",
4404
+ "executable": true
4405
+ },
4406
+ "switch_user": {
4407
+ "slots": [],
4408
+ "optional": [],
4409
+ "risk": "caution",
4410
+ "needs_sudo": false,
4411
+ "platforms": [
4412
+ "pi",
4413
+ "windows"
4414
+ ],
4415
+ "desc": "Switch user",
4416
+ "executable": true
4417
+ },
4418
+ "switch_window": {
4419
+ "slots": [],
4420
+ "optional": [],
4421
+ "risk": "safe",
4422
+ "needs_sudo": false,
4423
+ "platforms": [
4424
+ "pi",
4425
+ "windows"
4426
+ ],
4427
+ "desc": "Switch to the next window (Alt+Tab)",
4428
+ "executable": true
4429
+ },
4430
+ "sync_time": {
4431
+ "slots": [],
4432
+ "optional": [],
4433
+ "risk": "safe",
4434
+ "needs_sudo": true,
4435
+ "platforms": [
4436
+ "pi",
4437
+ "windows"
4438
+ ],
4439
+ "desc": "Force NTP time sync",
4440
+ "executable": true
4441
+ },
4442
+ "task_view": {
4443
+ "slots": [],
4444
+ "optional": [],
4445
+ "risk": "safe",
4446
+ "needs_sudo": false,
4447
+ "platforms": [
4448
+ "pi",
4449
+ "windows"
4450
+ ],
4451
+ "desc": "Open task view / all windows",
4452
+ "executable": true
4453
+ },
4454
+ "touchpad_off": {
4455
+ "slots": [],
4456
+ "optional": [],
4457
+ "risk": "caution",
4458
+ "needs_sudo": false,
4459
+ "platforms": [
4460
+ "pi",
4461
+ "windows"
4462
+ ],
4463
+ "desc": "Disable touchpad",
4464
+ "executable": true
4465
+ },
4466
+ "touchpad_on": {
4467
+ "slots": [],
4468
+ "optional": [],
4469
+ "risk": "safe",
4470
+ "needs_sudo": false,
4471
+ "platforms": [
4472
+ "pi",
4473
+ "windows"
4474
+ ],
4475
+ "desc": "Enable touchpad",
4476
+ "executable": true
4477
+ },
4478
+ "traceroute": {
4479
+ "slots": [
4480
+ "host"
4481
+ ],
4482
+ "optional": [],
4483
+ "risk": "safe",
4484
+ "needs_sudo": false,
4485
+ "platforms": [
4486
+ "pi",
4487
+ "windows"
4488
+ ],
4489
+ "desc": "Traceroute to a host",
4490
+ "executable": true
4491
+ },
4492
+ "transcribe_audio": {
4493
+ "slots": [
4494
+ "file"
4495
+ ],
4496
+ "optional": [
4497
+ "language"
4498
+ ],
4499
+ "risk": "safe",
4500
+ "needs_sudo": false,
4501
+ "platforms": [
4502
+ "pi",
4503
+ "windows"
4504
+ ],
4505
+ "desc": "Speech-to-text a file",
4506
+ "executable": true
4507
+ },
4508
+ "transfer_files": {
4509
+ "slots": [
4510
+ "file",
4511
+ "host"
4512
+ ],
4513
+ "optional": [],
4514
+ "risk": "caution",
4515
+ "needs_sudo": false,
4516
+ "platforms": [
4517
+ "pi",
4518
+ "windows"
4519
+ ],
4520
+ "desc": "Copy/rsync/scp files to a host",
4521
+ "executable": true
4522
+ },
4523
+ "type_text": {
4524
+ "slots": [
4525
+ "text"
4526
+ ],
4527
+ "optional": [],
4528
+ "risk": "safe",
4529
+ "needs_sudo": false,
4530
+ "platforms": [
4531
+ "pi",
4532
+ "windows"
4533
+ ],
4534
+ "desc": "Type the given text at the cursor",
4535
+ "executable": true
4536
+ },
4537
+ "unban_ip": {
4538
+ "slots": [
4539
+ "ip"
4540
+ ],
4541
+ "optional": [],
4542
+ "risk": "caution",
4543
+ "needs_sudo": true,
4544
+ "platforms": [
4545
+ "pi",
4546
+ "windows"
4547
+ ],
4548
+ "desc": "Unban an IP",
4549
+ "executable": true
4550
+ },
4551
+ "undo": {
4552
+ "slots": [],
4553
+ "optional": [],
4554
+ "risk": "safe",
4555
+ "needs_sudo": false,
4556
+ "platforms": [
4557
+ "pi",
4558
+ "windows"
4559
+ ],
4560
+ "desc": "Undo (Ctrl+Z)",
4561
+ "executable": true
4562
+ },
4563
+ "uninstall_app": {
4564
+ "slots": [
4565
+ "app"
4566
+ ],
4567
+ "optional": [],
4568
+ "risk": "critical",
4569
+ "needs_sudo": false,
4570
+ "platforms": [
4571
+ "pi",
4572
+ "windows"
4573
+ ],
4574
+ "desc": "Uninstall an app",
4575
+ "executable": true
4576
+ },
4577
+ "uninstall_package": {
4578
+ "slots": [
4579
+ "name"
4580
+ ],
4581
+ "optional": [],
4582
+ "risk": "critical",
4583
+ "needs_sudo": true,
4584
+ "platforms": [
4585
+ "pi",
4586
+ "windows"
4587
+ ],
4588
+ "desc": "Remove a package",
4589
+ "executable": true
4590
+ },
4591
+ "unknown": {
4592
+ "slots": [],
4593
+ "optional": [],
4594
+ "risk": "safe",
4595
+ "needs_sudo": false,
4596
+ "platforms": [
4597
+ "pi",
4598
+ "windows"
4599
+ ],
4600
+ "desc": "Not a laptop command / not understood - do nothing",
4601
+ "executable": true
4602
+ },
4603
+ "unmount_drive": {
4604
+ "slots": [
4605
+ "device"
4606
+ ],
4607
+ "optional": [],
4608
+ "risk": "caution",
4609
+ "needs_sudo": true,
4610
+ "platforms": [
4611
+ "pi",
4612
+ "windows"
4613
+ ],
4614
+ "desc": "Unmount/eject a drive",
4615
+ "executable": true
4616
+ },
4617
+ "unmute": {
4618
+ "slots": [],
4619
+ "optional": [],
4620
+ "risk": "safe",
4621
+ "needs_sudo": false,
4622
+ "platforms": [
4623
+ "pi",
4624
+ "windows"
4625
+ ],
4626
+ "desc": "Unmute audio",
4627
+ "executable": true
4628
+ },
4629
+ "update_packages": {
4630
+ "slots": [],
4631
+ "optional": [],
4632
+ "risk": "safe",
4633
+ "needs_sudo": true,
4634
+ "platforms": [
4635
+ "pi",
4636
+ "windows"
4637
+ ],
4638
+ "desc": "Refresh package lists",
4639
+ "executable": true
4640
+ },
4641
+ "volume_down": {
4642
+ "slots": [],
4643
+ "optional": [
4644
+ "step"
4645
+ ],
4646
+ "risk": "safe",
4647
+ "needs_sudo": false,
4648
+ "platforms": [
4649
+ "pi",
4650
+ "windows"
4651
+ ],
4652
+ "desc": "Decrease volume (default step 10)",
4653
+ "executable": true
4654
+ },
4655
+ "volume_up": {
4656
+ "slots": [],
4657
+ "optional": [
4658
+ "step"
4659
+ ],
4660
+ "risk": "safe",
4661
+ "needs_sudo": false,
4662
+ "platforms": [
4663
+ "pi",
4664
+ "windows"
4665
+ ],
4666
+ "desc": "Increase volume (default step 10)",
4667
+ "executable": true
4668
+ },
4669
+ "vpn_connect": {
4670
+ "slots": [],
4671
+ "optional": [],
4672
+ "risk": "safe",
4673
+ "needs_sudo": false,
4674
+ "platforms": [
4675
+ "pi",
4676
+ "windows"
4677
+ ],
4678
+ "desc": "Connect VPN",
4679
+ "executable": true
4680
+ },
4681
+ "vpn_disconnect": {
4682
+ "slots": [],
4683
+ "optional": [],
4684
+ "risk": "caution",
4685
+ "needs_sudo": false,
4686
+ "platforms": [
4687
+ "pi",
4688
+ "windows"
4689
+ ],
4690
+ "desc": "Disconnect VPN",
4691
+ "executable": true
4692
+ },
4693
+ "watch_command": {
4694
+ "slots": [
4695
+ "command"
4696
+ ],
4697
+ "optional": [
4698
+ "interval"
4699
+ ],
4700
+ "risk": "caution",
4701
+ "needs_sudo": false,
4702
+ "platforms": [
4703
+ "pi",
4704
+ "windows"
4705
+ ],
4706
+ "desc": "Re-run a command on an interval",
4707
+ "executable": true
4708
+ },
4709
+ "web_login": {
4710
+ "slots": [
4711
+ "site",
4712
+ "username",
4713
+ "password"
4714
+ ],
4715
+ "optional": [],
4716
+ "risk": "caution",
4717
+ "needs_sudo": false,
4718
+ "platforms": [
4719
+ "pi",
4720
+ "windows"
4721
+ ],
4722
+ "desc": "Open a website and log in with supplied credentials",
4723
+ "executable": true
4724
+ },
4725
+ "web_search": {
4726
+ "slots": [
4727
+ "query"
4728
+ ],
4729
+ "optional": [],
4730
+ "risk": "safe",
4731
+ "needs_sudo": false,
4732
+ "platforms": [
4733
+ "pi",
4734
+ "windows"
4735
+ ],
4736
+ "desc": "Google search for a query",
4737
+ "executable": true
4738
+ },
4739
+ "wifi_off": {
4740
+ "slots": [],
4741
+ "optional": [],
4742
+ "risk": "critical",
4743
+ "needs_sudo": false,
4744
+ "platforms": [
4745
+ "pi",
4746
+ "windows"
4747
+ ],
4748
+ "desc": "Turn Wi-Fi off",
4749
+ "executable": true
4750
+ },
4751
+ "wifi_on": {
4752
+ "slots": [],
4753
+ "optional": [],
4754
+ "risk": "caution",
4755
+ "needs_sudo": false,
4756
+ "platforms": [
4757
+ "pi",
4758
+ "windows"
4759
+ ],
4760
+ "desc": "Turn Wi-Fi on",
4761
+ "executable": true
4762
+ },
4763
+ "youtube_search": {
4764
+ "slots": [
4765
+ "query"
4766
+ ],
4767
+ "optional": [],
4768
+ "risk": "safe",
4769
+ "needs_sudo": false,
4770
+ "platforms": [
4771
+ "pi",
4772
+ "windows"
4773
+ ],
4774
+ "desc": "Search / play something on YouTube",
4775
+ "executable": true
4776
+ },
4777
+ "zoom_in": {
4778
+ "slots": [],
4779
+ "optional": [],
4780
+ "risk": "safe",
4781
+ "needs_sudo": false,
4782
+ "platforms": [
4783
+ "pi",
4784
+ "windows"
4785
+ ],
4786
+ "desc": "Zoom in",
4787
+ "executable": true
4788
+ },
4789
+ "zoom_out": {
4790
+ "slots": [],
4791
+ "optional": [],
4792
+ "risk": "safe",
4793
+ "needs_sudo": false,
4794
+ "platforms": [
4795
+ "pi",
4796
+ "windows"
4797
+ ],
4798
+ "desc": "Zoom out",
4799
+ "executable": true
4800
+ },
4801
+ "zoom_reset": {
4802
+ "slots": [],
4803
+ "optional": [],
4804
+ "risk": "safe",
4805
+ "needs_sudo": false,
4806
+ "platforms": [
4807
+ "pi",
4808
+ "windows"
4809
+ ],
4810
+ "desc": "Reset zoom to 100%",
4811
+ "executable": true
4812
+ }
4813
+ },
4814
+ "slot_types": {
4815
+ "action": "enum",
4816
+ "address": "text",
4817
+ "alt": "enum",
4818
+ "amount": "int",
4819
+ "angle": "int",
4820
+ "app": "enum",
4821
+ "at": "time",
4822
+ "baud": "int",
4823
+ "command": "text",
4824
+ "contact": "text",
4825
+ "container": "text",
4826
+ "cores": "text",
4827
+ "count": "int",
4828
+ "device": "text",
4829
+ "dst": "text",
4830
+ "duty": "int",
4831
+ "edge": "enum",
4832
+ "expression": "text",
4833
+ "file": "text",
4834
+ "folder": "enum",
4835
+ "format": "text",
4836
+ "freq": "int",
4837
+ "governor": "enum",
4838
+ "host": "text",
4839
+ "iface": "text",
4840
+ "image": "text",
4841
+ "interface": "enum",
4842
+ "interval": "int",
4843
+ "ip": "text",
4844
+ "key": "enum",
4845
+ "label": "text",
4846
+ "language": "text",
4847
+ "layout": "text",
4848
+ "link": "text",
4849
+ "locale": "text",
4850
+ "mode": "enum",
4851
+ "model": "text",
4852
+ "name": "text",
4853
+ "numbering": "enum",
4854
+ "order": "text",
4855
+ "orientation": "enum",
4856
+ "output": "enum",
4857
+ "overlay": "text",
4858
+ "page": "enum",
4859
+ "password": "text",
4860
+ "path": "text",
4861
+ "pid": "int",
4862
+ "pin": "int",
4863
+ "port": "int",
4864
+ "priority": "text",
4865
+ "pull": "enum",
4866
+ "query": "text",
4867
+ "register": "text",
4868
+ "resolution": "text",
4869
+ "role": "text",
4870
+ "schedule": "text",
4871
+ "serial_port": "text",
4872
+ "service": "enum",
4873
+ "site": "enum",
4874
+ "size": "int",
4875
+ "src": "text",
4876
+ "ssid": "text",
4877
+ "step": "int",
4878
+ "subject": "text",
4879
+ "target": "enum",
4880
+ "text": "text",
4881
+ "time": "time",
4882
+ "title": "text",
4883
+ "to": "text",
4884
+ "tz": "text",
4885
+ "unit": "enum",
4886
+ "url": "text",
4887
+ "user": "text",
4888
+ "username": "text",
4889
+ "value": "int"
4890
+ },
4891
+ "action_slot_types": {
4892
+ "web_login.site": "text",
4893
+ "create_calendar_event.time": "text",
4894
+ "set_mouse_speed.value": "text"
4895
+ },
4896
+ "enums": {
4897
+ "action": [
4898
+ "add_persistent_mount",
4899
+ "airplane_mode_off",
4900
+ "airplane_mode_on",
4901
+ "antivirus_scan",
4902
+ "attach_session",
4903
+ "backup_disk_image",
4904
+ "battery_saver_off",
4905
+ "battery_saver_on",
4906
+ "bcm_to_board",
4907
+ "bluetooth_connect",
4908
+ "bluetooth_off",
4909
+ "bluetooth_on",
4910
+ "board_to_bcm",
4911
+ "bookmark_page",
4912
+ "brightness_down",
4913
+ "brightness_up",
4914
+ "browser_back",
4915
+ "browser_forward",
4916
+ "build_project",
4917
+ "calculate",
4918
+ "camera_photo",
4919
+ "camera_video",
4920
+ "cancel_alarm",
4921
+ "cancel_shutdown",
4922
+ "cancel_timer",
4923
+ "check_ai_accelerator",
4924
+ "check_filesystem",
4925
+ "check_port",
4926
+ "check_updates",
4927
+ "clarify",
4928
+ "clear_notifications",
4929
+ "clear_temp_files",
4930
+ "clipboard_history",
4931
+ "clone_disk",
4932
+ "close_app",
4933
+ "close_tab",
4934
+ "close_window",
4935
+ "compress_file",
4936
+ "connect_wifi",
4937
+ "convert_media",
4938
+ "copy",
4939
+ "copy_file",
4940
+ "copy_ssh_key",
4941
+ "create_calendar_event",
4942
+ "create_file",
4943
+ "create_folder",
4944
+ "create_service",
4945
+ "create_symlink",
4946
+ "create_virtualenv",
4947
+ "cut",
4948
+ "dark_mode_off",
4949
+ "dark_mode_on",
4950
+ "delete_file",
4951
+ "disable_auto_updates",
4952
+ "discover_devices",
4953
+ "display_mode",
4954
+ "dnd_off",
4955
+ "dnd_on",
4956
+ "dns_lookup",
4957
+ "docker_compose_up",
4958
+ "docker_list",
4959
+ "docker_prune",
4960
+ "docker_run",
4961
+ "docker_stop",
4962
+ "download_file",
4963
+ "drop_caches",
4964
+ "edit_system_config",
4965
+ "emoji_panel",
4966
+ "empty_recycle_bin",
4967
+ "enable_auto_updates",
4968
+ "enable_zram",
4969
+ "expand_filesystem",
4970
+ "extract_archive",
4971
+ "factory_reset",
4972
+ "find_command",
4973
+ "find_in_page",
4974
+ "firewall_allow",
4975
+ "firewall_deny",
4976
+ "firewall_off",
4977
+ "firewall_on",
4978
+ "firewall_status",
4979
+ "fix_gpio_permissions",
4980
+ "flash_firmware",
4981
+ "flush_dns",
4982
+ "forget_wifi",
4983
+ "format_drive",
4984
+ "fullscreen",
4985
+ "get_bandwidth_usage",
4986
+ "get_battery",
4987
+ "get_boot_config",
4988
+ "get_boot_logs",
4989
+ "get_boot_time",
4990
+ "get_brightness",
4991
+ "get_cpu_clock",
4992
+ "get_cpu_governor",
4993
+ "get_cpu_pressure",
4994
+ "get_cpu_usage",
4995
+ "get_current_user",
4996
+ "get_date",
4997
+ "get_default_gateway",
4998
+ "get_diagnostics",
4999
+ "get_disk_health",
5000
+ "get_disk_io",
5001
+ "get_disk_space",
5002
+ "get_ethernet_status",
5003
+ "get_fan_speed",
5004
+ "get_firmware_log",
5005
+ "get_firmware_version",
5006
+ "get_folder_sizes",
5007
+ "get_gpu_memory",
5008
+ "get_gpu_usage",
5009
+ "get_hostname",
5010
+ "get_interrupts",
5011
+ "get_ip",
5012
+ "get_kernel_log",
5013
+ "get_kernel_version",
5014
+ "get_load_average",
5015
+ "get_mac_address",
5016
+ "get_memory_pressure",
5017
+ "get_per_core_usage",
5018
+ "get_power_draw",
5019
+ "get_public_ip",
5020
+ "get_radio_status",
5021
+ "get_ram_usage",
5022
+ "get_reboot_history",
5023
+ "get_sdcard_info",
5024
+ "get_service_logs",
5025
+ "get_slab_usage",
5026
+ "get_swap_usage",
5027
+ "get_system_info",
5028
+ "get_temperature",
5029
+ "get_throttle_status",
5030
+ "get_time",
5031
+ "get_time_sync",
5032
+ "get_uptime",
5033
+ "get_voltage",
5034
+ "get_volume",
5035
+ "get_wifi_signal",
5036
+ "gpio_alt_functions",
5037
+ "gpio_blink",
5038
+ "gpio_conflicts",
5039
+ "gpio_debug",
5040
+ "gpio_debug_all",
5041
+ "gpio_info",
5042
+ "gpio_off",
5043
+ "gpio_on",
5044
+ "gpio_pin_role",
5045
+ "gpio_pulse",
5046
+ "gpio_pwm",
5047
+ "gpio_read",
5048
+ "gpio_reset",
5049
+ "gpio_reset_all",
5050
+ "gpio_servo",
5051
+ "gpio_set_alt",
5052
+ "gpio_set_mode",
5053
+ "gpio_set_pull",
5054
+ "gpio_stop_watch",
5055
+ "gpio_toggle",
5056
+ "gpio_watch",
5057
+ "harden_ssh",
5058
+ "hash_file",
5059
+ "help",
5060
+ "hibernate",
5061
+ "high_contrast_off",
5062
+ "high_contrast_on",
5063
+ "hotspot_off",
5064
+ "hotspot_on",
5065
+ "i2c_dump",
5066
+ "i2c_read",
5067
+ "i2c_scan",
5068
+ "i2c_write",
5069
+ "incognito_window",
5070
+ "install_package",
5071
+ "install_python_package",
5072
+ "install_updates",
5073
+ "interface_disable",
5074
+ "interface_enable",
5075
+ "kill_process",
5076
+ "list_1wire_sensors",
5077
+ "list_arp",
5078
+ "list_audio_devices",
5079
+ "list_banned_ips",
5080
+ "list_bluetooth_devices",
5081
+ "list_cameras",
5082
+ "list_connections",
5083
+ "list_disks",
5084
+ "list_displays",
5085
+ "list_failed_services",
5086
+ "list_files",
5087
+ "list_free_gpio",
5088
+ "list_gpio",
5089
+ "list_gpio_chips",
5090
+ "list_installed_apps",
5091
+ "list_kernel_modules",
5092
+ "list_llm_models",
5093
+ "list_logged_in_users",
5094
+ "list_open_files",
5095
+ "list_open_ports",
5096
+ "list_packages",
5097
+ "list_partitions",
5098
+ "list_pci",
5099
+ "list_printers",
5100
+ "list_processes",
5101
+ "list_serial_ports",
5102
+ "list_services",
5103
+ "list_sessions",
5104
+ "list_spi_devices",
5105
+ "list_usb",
5106
+ "list_wifi",
5107
+ "load_overlay",
5108
+ "lock_screen",
5109
+ "magnifier_off",
5110
+ "magnifier_on",
5111
+ "manage_users",
5112
+ "maximize_window",
5113
+ "media_next",
5114
+ "media_pause",
5115
+ "media_play",
5116
+ "media_play_pause",
5117
+ "media_prev",
5118
+ "mic_mute",
5119
+ "mic_unmute",
5120
+ "minimize_window",
5121
+ "monitor_health",
5122
+ "monitor_hotplug",
5123
+ "mount_drive",
5124
+ "move_file",
5125
+ "mute",
5126
+ "narrator_off",
5127
+ "narrator_on",
5128
+ "network_status",
5129
+ "new_tab",
5130
+ "new_virtual_desktop",
5131
+ "next_tab",
5132
+ "night_light_off",
5133
+ "night_light_on",
5134
+ "onscreen_keyboard",
5135
+ "open_app",
5136
+ "open_config_tool",
5137
+ "open_file",
5138
+ "open_folder",
5139
+ "open_notification_center",
5140
+ "open_recycle_bin",
5141
+ "open_serial_terminal",
5142
+ "open_settings",
5143
+ "open_site",
5144
+ "open_url",
5145
+ "packet_capture",
5146
+ "partition_disk",
5147
+ "paste",
5148
+ "ping",
5149
+ "port_forward",
5150
+ "power_mode",
5151
+ "press_key",
5152
+ "prev_tab",
5153
+ "print_file",
5154
+ "print_page",
5155
+ "pull_llm_model",
5156
+ "read_file",
5157
+ "recent_files",
5158
+ "record_audio",
5159
+ "redo",
5160
+ "refresh",
5161
+ "remote_shell",
5162
+ "rename_file",
5163
+ "reopen_tab",
5164
+ "repair_packages",
5165
+ "repeat_last",
5166
+ "restart",
5167
+ "rotate_screen",
5168
+ "run_background",
5169
+ "run_benchmark",
5170
+ "run_command",
5171
+ "run_llm",
5172
+ "run_llm_benchmark",
5173
+ "run_network_benchmark",
5174
+ "run_script",
5175
+ "run_stress_test",
5176
+ "save_file",
5177
+ "scan_lan",
5178
+ "scan_ports",
5179
+ "schedule_task",
5180
+ "screen_off",
5181
+ "screen_record_start",
5182
+ "screen_record_stop",
5183
+ "screenshot",
5184
+ "scroll_down",
5185
+ "scroll_up",
5186
+ "search_files",
5187
+ "search_in_files",
5188
+ "search_package",
5189
+ "select_all",
5190
+ "send_email",
5191
+ "send_message",
5192
+ "service_disable",
5193
+ "service_enable",
5194
+ "service_restart",
5195
+ "service_start",
5196
+ "service_status",
5197
+ "service_stop",
5198
+ "set_alarm",
5199
+ "set_audio_output",
5200
+ "set_boot_order",
5201
+ "set_boot_target",
5202
+ "set_brightness",
5203
+ "set_cpu_affinity",
5204
+ "set_cpu_governor",
5205
+ "set_default_printer",
5206
+ "set_disk_label",
5207
+ "set_display_scale",
5208
+ "set_keyboard_layout",
5209
+ "set_locale",
5210
+ "set_mouse_speed",
5211
+ "set_owner",
5212
+ "set_permissions",
5213
+ "set_process_priority",
5214
+ "set_refresh_rate",
5215
+ "set_reminder",
5216
+ "set_resolution",
5217
+ "set_swap_size",
5218
+ "set_swappiness",
5219
+ "set_timer",
5220
+ "set_timezone",
5221
+ "set_volume",
5222
+ "set_wallpaper",
5223
+ "show_command_history",
5224
+ "show_desktop",
5225
+ "show_pinout",
5226
+ "show_wifi_password",
5227
+ "shutdown",
5228
+ "sign_out",
5229
+ "sleep",
5230
+ "snap_left",
5231
+ "snap_right",
5232
+ "speed_test",
5233
+ "start_session",
5234
+ "stop_llm",
5235
+ "stopwatch_start",
5236
+ "stopwatch_stop",
5237
+ "switch_input_language",
5238
+ "switch_user",
5239
+ "switch_window",
5240
+ "sync_time",
5241
+ "task_view",
5242
+ "touchpad_off",
5243
+ "touchpad_on",
5244
+ "traceroute",
5245
+ "transcribe_audio",
5246
+ "transfer_files",
5247
+ "type_text",
5248
+ "unban_ip",
5249
+ "undo",
5250
+ "uninstall_app",
5251
+ "uninstall_package",
5252
+ "unknown",
5253
+ "unmount_drive",
5254
+ "unmute",
5255
+ "update_packages",
5256
+ "volume_down",
5257
+ "volume_up",
5258
+ "vpn_connect",
5259
+ "vpn_disconnect",
5260
+ "watch_command",
5261
+ "web_login",
5262
+ "web_search",
5263
+ "wifi_off",
5264
+ "wifi_on",
5265
+ "youtube_search",
5266
+ "zoom_in",
5267
+ "zoom_out",
5268
+ "zoom_reset"
5269
+ ],
5270
+ "alt": [
5271
+ "a0",
5272
+ "a1",
5273
+ "a2",
5274
+ "a3",
5275
+ "a4",
5276
+ "a5"
5277
+ ],
5278
+ "app": [
5279
+ "browser",
5280
+ "calculator",
5281
+ "calendar",
5282
+ "camera",
5283
+ "chrome",
5284
+ "chromium",
5285
+ "clock",
5286
+ "cmd",
5287
+ "control_panel",
5288
+ "discord",
5289
+ "disk_management",
5290
+ "edge",
5291
+ "excel",
5292
+ "file_explorer",
5293
+ "firefox",
5294
+ "media_player",
5295
+ "notepad",
5296
+ "obs",
5297
+ "onenote",
5298
+ "outlook",
5299
+ "paint",
5300
+ "photos",
5301
+ "powerpoint",
5302
+ "powershell",
5303
+ "signal",
5304
+ "slack",
5305
+ "sms",
5306
+ "snipping_tool",
5307
+ "spotify",
5308
+ "steam",
5309
+ "sticky_notes",
5310
+ "store",
5311
+ "task_manager",
5312
+ "teams",
5313
+ "telegram",
5314
+ "terminal",
5315
+ "thonny",
5316
+ "vlc",
5317
+ "vscode",
5318
+ "whatsapp",
5319
+ "word",
5320
+ "zoom"
5321
+ ],
5322
+ "edge": [
5323
+ "both",
5324
+ "falling",
5325
+ "rising"
5326
+ ],
5327
+ "folder": [
5328
+ "c_drive",
5329
+ "d_drive",
5330
+ "desktop",
5331
+ "documents",
5332
+ "downloads",
5333
+ "home",
5334
+ "music",
5335
+ "pictures",
5336
+ "videos"
5337
+ ],
5338
+ "governor": [
5339
+ "conservative",
5340
+ "ondemand",
5341
+ "performance",
5342
+ "powersave",
5343
+ "schedutil"
5344
+ ],
5345
+ "interface": [
5346
+ "camera",
5347
+ "i2c",
5348
+ "onewire",
5349
+ "serial",
5350
+ "spi"
5351
+ ],
5352
+ "key": [
5353
+ "backspace",
5354
+ "delete",
5355
+ "down",
5356
+ "end",
5357
+ "enter",
5358
+ "escape",
5359
+ "f11",
5360
+ "f5",
5361
+ "home",
5362
+ "left",
5363
+ "page_down",
5364
+ "right",
5365
+ "space",
5366
+ "tab",
5367
+ "up"
5368
+ ],
5369
+ "mode": [
5370
+ "balanced",
5371
+ "duplicate",
5372
+ "extend",
5373
+ "input",
5374
+ "output",
5375
+ "pc_only",
5376
+ "performance",
5377
+ "second_only"
5378
+ ],
5379
+ "numbering": [
5380
+ "board"
5381
+ ],
5382
+ "orientation": [
5383
+ "landscape",
5384
+ "landscape_flipped",
5385
+ "portrait"
5386
+ ],
5387
+ "output": [
5388
+ "bluetooth",
5389
+ "hdmi",
5390
+ "headphones",
5391
+ "speakers"
5392
+ ],
5393
+ "page": [
5394
+ "about",
5395
+ "accounts",
5396
+ "apps",
5397
+ "battery",
5398
+ "bluetooth",
5399
+ "date_time",
5400
+ "default_apps",
5401
+ "display",
5402
+ "keyboard",
5403
+ "language",
5404
+ "mouse",
5405
+ "network",
5406
+ "notifications",
5407
+ "personalization",
5408
+ "power",
5409
+ "printers",
5410
+ "privacy",
5411
+ "sound",
5412
+ "storage",
5413
+ "update",
5414
+ "wifi"
5415
+ ],
5416
+ "pull": [
5417
+ "down",
5418
+ "none",
5419
+ "up"
5420
+ ],
5421
+ "service": [
5422
+ "abhi",
5423
+ "apache",
5424
+ "bhai",
5425
+ "bluetooth",
5426
+ "cron",
5427
+ "diijye",
5428
+ "dijie",
5429
+ "dijiye",
5430
+ "docker",
5431
+ "kijiye",
5432
+ "mosquitto",
5433
+ "mysql",
5434
+ "nginx",
5435
+ "nodered",
5436
+ "pihole",
5437
+ "plase",
5438
+ "please",
5439
+ "samba",
5440
+ "spooler",
5441
+ "ssh",
5442
+ "thanks",
5443
+ "vnc",
5444
+ "w32time",
5445
+ "zara"
5446
+ ],
5447
+ "site": [
5448
+ "amazon",
5449
+ "chatgpt",
5450
+ "claude",
5451
+ "facebook",
5452
+ "flipkart",
5453
+ "github",
5454
+ "gmail",
5455
+ "google",
5456
+ "google_drive",
5457
+ "google_maps",
5458
+ "hotstar",
5459
+ "instagram",
5460
+ "irctc",
5461
+ "linkedin",
5462
+ "netflix",
5463
+ "stackoverflow",
5464
+ "twitter",
5465
+ "whatsapp_web",
5466
+ "wikipedia",
5467
+ "youtube"
5468
+ ],
5469
+ "target": [
5470
+ "console",
5471
+ "cpu",
5472
+ "desktop",
5473
+ "disk",
5474
+ "graphical",
5475
+ "headless",
5476
+ "memory",
5477
+ "text"
5478
+ ],
5479
+ "unit": [
5480
+ "hour",
5481
+ "min",
5482
+ "sec"
5483
+ ]
5484
+ },
5485
+ "int_ranges": {
5486
+ "amount": [
5487
+ 0,
5488
+ 999
5489
+ ],
5490
+ "angle": [
5491
+ 0,
5492
+ 180
5493
+ ],
5494
+ "baud": [
5495
+ 1,
5496
+ 999999
5497
+ ],
5498
+ "count": [
5499
+ 1,
5500
+ 99
5501
+ ],
5502
+ "duty": [
5503
+ 0,
5504
+ 100
5505
+ ],
5506
+ "freq": [
5507
+ 1,
5508
+ 99999
5509
+ ],
5510
+ "interval": [
5511
+ 1,
5512
+ 9999
5513
+ ],
5514
+ "pid": [
5515
+ 1,
5516
+ 999999
5517
+ ],
5518
+ "pin": [
5519
+ 0,
5520
+ 40
5521
+ ],
5522
+ "port": [
5523
+ 1,
5524
+ 65535
5525
+ ],
5526
+ "size": [
5527
+ 1,
5528
+ 99999
5529
+ ],
5530
+ "step": [
5531
+ 1,
5532
+ 100
5533
+ ],
5534
+ "value": [
5535
+ 0,
5536
+ 255
5537
+ ]
5538
+ }
5539
+ }
model/catalog.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Union catalog (371 actions) in the shape the tokenizer/grammar expect.
2
+ Slot types: enum (closed set, canonical value), int (digits within range), time (HH:MM), text (verbatim substring of input).
3
+ A slot's type is global (SLOT_TYPES) unless ACTION_SLOT_TYPES overrides it for one action, e.g. web_login.site is text
4
+ while open_site.site is enum; create_calendar_event.time is text while set_alarm.time is HH:MM.
5
+ """
6
+ import json, os
7
+ HERE = os.path.dirname(os.path.abspath(__file__))
8
+ _C = json.load(open(os.path.join(HERE, "catalog.json")))
9
+ ACTIONS = _C["actions"]
10
+ SLOT_TYPES = _C["slot_types"]
11
+ ACTION_SLOT_TYPES = _C["action_slot_types"]
12
+ ENUMS = _C["enums"]
13
+ INT_RANGES = {k: tuple(v) for k, v in _C["int_ranges"].items()}
14
+ ACTION_NAMES = list(ACTIONS)
15
+
16
+
17
+ def slot_type(action, slot):
18
+ return ACTION_SLOT_TYPES.get(f"{action}.{slot}", SLOT_TYPES[slot])
19
+
20
+
21
+ def slot_order(action):
22
+ a = ACTIONS[action]
23
+ return a["slots"] + a["optional"]
model/config.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "max_out": 112,
3
+ "n_dec": 3,
4
+ "h": 8,
5
+ "n_enc": 5,
6
+ "d": 256,
7
+ "n_out": 1052,
8
+ "n_in": 200,
9
+ "max_in": 128,
10
+ "f": 768
11
+ }
model/grammar.py ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Grammar-constrained decoding: every output is schema-valid.
3
+ action -> required slots (catalog order) -> optional slots (catalog order) -> <eos>
4
+ enum: only listed values | int: digits within the slot's range | time: HH:MM | text: verbatim substring of the input
5
+ """
6
+ import os, sys
7
+ HERE = os.path.dirname(os.path.abspath(__file__)); sys.path.insert(0, HERE)
8
+ from catalog import ACTIONS, SLOT_TYPES, INT_RANGES, slot_type, slot_order # noqa
9
+ from tokenizer import EOS # noqa
10
+
11
+
12
+ class Grammar:
13
+ def __init__(self, tok):
14
+ self.tok = tok
15
+ self.action_ids = [tok.out_idx[a] for a in ACTIONS]
16
+ self.enum_start = {} # slot -> enum token ids
17
+ for t, (s, _) in tok.enum_tokens.items():
18
+ self.enum_start.setdefault(s, []).append(tok.out_idx[t])
19
+ self.key_id = {k[:-1]: tok.out_idx[k] for k in tok.key_tokens}
20
+ self.id2slot = {}
21
+ for s, ids in self.enum_start.items():
22
+ for i in ids: self.id2slot[i] = s
23
+ for s, i in self.key_id.items(): self.id2slot[i] = s
24
+ self.char_of = {v: k for k, v in tok.char_id.items()}
25
+ self.digit = {d: tok.char_id[str(d)] for d in range(10)}
26
+ self.colon = tok.char_id[":"]
27
+
28
+ def starts(self, action, slot):
29
+ return self.enum_start.get(slot, []) if slot_type(action, slot) == "enum" else [self.key_id[slot]]
30
+
31
+ def _parse(self, prefix):
32
+ if not prefix:
33
+ return None, [], None, "", False
34
+ action = self.tok.out_vocab[prefix[0]]
35
+ done, cur, buf, in_text, quotes = [], None, "", False, 0
36
+ for i in prefix[1:]:
37
+ if i in self.id2slot and not in_text:
38
+ if cur is not None: done.append(cur)
39
+ cur, buf, quotes = self.id2slot[i], "", 0
40
+ if slot_type(action, cur) == "enum":
41
+ done.append(cur); cur = None
42
+ elif i == self.tok.quote:
43
+ quotes += 1; in_text = quotes == 1
44
+ if quotes == 2: done.append(cur); cur = None
45
+ else:
46
+ buf += self.char_of.get(i, "")
47
+ return action, done, cur, buf, in_text
48
+
49
+ def _next(self, action, done):
50
+ a = ACTIONS[action]; order = slot_order(action)
51
+ emitted = [s for s in order if s in done]
52
+ last = order.index(emitted[-1]) if emitted else -1
53
+ for s in a["slots"]:
54
+ if s not in done: return [s], False
55
+ if "amount" in done and "unit" in a["optional"] and "unit" not in done:
56
+ return ["unit"], False
57
+ opts = [s for s in a["optional"] if order.index(s) > last and s not in done]
58
+ if "unit" in opts and "amount" not in done: opts.remove("unit")
59
+ return opts, True
60
+
61
+ def allowed(self, prefix, src_text):
62
+ if not prefix:
63
+ return self.action_ids
64
+ action, done, cur, buf, in_text = self._parse(prefix)
65
+ if cur is not None:
66
+ ty = slot_type(action, cur)
67
+ if ty == "int":
68
+ lo, hi = INT_RANGES[cur]; out = []
69
+ if buf != "0":
70
+ for d in range(10):
71
+ if not buf and d == 0 and lo > 0: continue
72
+ if int(buf + str(d)) <= hi: out.append(self.digit[d])
73
+ if buf and lo <= int(buf) <= hi:
74
+ nxt, end = self._next(action, done + [cur])
75
+ out += [i for s in nxt for i in self.starts(action, s)]
76
+ if end: out.append(EOS)
77
+ return out
78
+ if ty == "time": # HH:MM
79
+ n = len(buf)
80
+ if n == 0: return [self.digit[d] for d in range(3)]
81
+ if n == 1: return [self.digit[d] for d in range(10) if int(buf + str(d)) <= 23]
82
+ if n == 2: return [self.colon]
83
+ if n == 3: return [self.digit[d] for d in range(6)]
84
+ if n == 4: return [self.digit[d] for d in range(10)]
85
+ nxt, end = self._next(action, done + [cur])
86
+ out = [i for s in nxt for i in self.starts(action, s)]
87
+ if end: out.append(EOS)
88
+ return out
89
+ if ty == "text":
90
+ if not in_text: return [self.tok.quote]
91
+ out = []
92
+ for c, cid in self.tok.char_id.items():
93
+ if (buf + c) in src_text and not (not buf and c == " ") and not (buf.endswith(" ") and c == " "):
94
+ out.append(cid)
95
+ if buf and not buf.endswith(" "): out.append(self.tok.quote)
96
+ return out
97
+ nxt, end = self._next(action, done)
98
+ out = [i for s in nxt for i in self.starts(action, s)]
99
+ if end: out.append(EOS)
100
+ return out
model/model.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:30ff9a19e8f007cabcaa2133b61d0a3389adcac16e354763babf874d8d0d74c8
3
+ size 23912849
model/normalize.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Input normalisation (what the encoder sees) and case recovery for copied free-text slots."""
2
+ import re
3
+
4
+ def normalize(s):
5
+ s = s.lower().replace('"', " ").replace("`", " ").replace("’", "'").replace("“", " ").replace("”", " ")
6
+ s = re.sub(r"\s+", " ", s).strip()
7
+ return s
8
+
9
+ def recover_case(raw, value):
10
+ """The decoder copies free text in lowercase; find the same span in the raw input and return it with original case."""
11
+ if not value:
12
+ return value
13
+ m = re.search(re.escape(value), raw, re.I)
14
+ if m:
15
+ return m.group(0)
16
+ # whitespace may have been collapsed / quotes stripped: try a whitespace-tolerant match
17
+ pat = r"\s*".join(re.escape(c) if c != " " else r"[\s\"]+" for c in value)
18
+ m = re.search(pat, raw, re.I)
19
+ return m.group(0).strip(' "') if m else value
model/runtime.py ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Pure-numpy inference runtime (no torch) for the union command model.
2
+ from runtime import CommandModel
3
+ m = CommandModel("artifacts/final"); m.predict("volume saath pe kar do")
4
+ -> {"action": "set_volume", "value": 60, "_meta": {...}}
5
+ """
6
+ import json, math, os, re, sys, time
7
+ import numpy as np
8
+ HERE = os.path.dirname(os.path.abspath(__file__)); sys.path.insert(0, HERE)
9
+ from tokenizer import Tokenizer, BOS, EOS, PAD # noqa
10
+ from grammar import Grammar # noqa
11
+ from normalize import normalize, recover_case # noqa
12
+ from catalog import ACTIONS, slot_type # noqa
13
+ from snap import snap_target # noqa
14
+
15
+ def _erf(x):
16
+ s = np.sign(x); x = np.abs(x); t = 1.0 / (1.0 + 0.3275911 * x)
17
+ y = 1.0 - (((((1.061405429 * t - 1.453152027) * t) + 1.421413741) * t - 0.284496736) * t + 0.254829592) * t * np.exp(-x * x)
18
+ return s * y
19
+ def gelu(x): return 0.5 * x * (1.0 + _erf(x / math.sqrt(2.0)))
20
+ def layernorm(x, g, b, eps=1e-5):
21
+ m = x.mean(-1, keepdims=True); v = ((x - m) ** 2).mean(-1, keepdims=True); return (x - m) / np.sqrt(v + eps) * g + b
22
+ def softmax(x): x = x - x.max(-1, keepdims=True); e = np.exp(x); return e / e.sum(-1, keepdims=True)
23
+
24
+ class CommandModel:
25
+ def __init__(self, path):
26
+ self.cfg = json.load(open(os.path.join(path, "config.json")))
27
+ w = np.load(os.path.join(path, "model.npz")); self.W = {k: w[k].astype(np.float32) for k in w.files}
28
+ self.h = self.cfg["h"]; self.tok = Tokenizer(); self.gram = Grammar(self.tok)
29
+ self.max_in, self.max_out = self.cfg.get("max_in", 128), self.cfg.get("max_out", 112)
30
+ def _lin(self, x, n): return x @ self.W[n + ".weight"].T + self.W[n + ".bias"]
31
+ def _mha(self, x, mem, pre, mask):
32
+ T, D = x.shape; S = mem.shape[0]; h, dk = self.h, D // self.h
33
+ q = self._lin(x, pre + ".q").reshape(T, h, dk).transpose(1, 0, 2); k = self._lin(mem, pre + ".k").reshape(S, h, dk).transpose(1, 0, 2); v = self._lin(mem, pre + ".v").reshape(S, h, dk).transpose(1, 0, 2)
34
+ att = q @ k.transpose(0, 2, 1) / math.sqrt(dk)
35
+ if mask is not None: att = np.where(mask, att, -1e9)
36
+ return self._lin((softmax(att) @ v).transpose(1, 0, 2).reshape(T, D), pre + ".o")
37
+ def _ff(self, x, pre): return self._lin(gelu(self._lin(x, pre + ".a")), pre + ".b")
38
+ def _ln(self, x, pre): return layernorm(x, self.W[pre + ".weight"], self.W[pre + ".bias"])
39
+ def encode(self, ids):
40
+ W = self.W; x = W["in_emb.weight"][ids] + W["in_pos.weight"][:len(ids)]
41
+ for i in range(self.cfg["n_enc"]):
42
+ p = f"enc.{i}"; y = self._ln(x, p + ".ln1"); x = x + self._mha(y, y, p + ".att", None); x = x + self._ff(self._ln(x, p + ".ln2"), p + ".ff")
43
+ return self._ln(x, "enc_ln")
44
+ def decode_step(self, prefix, mem):
45
+ W = self.W; T = len(prefix); x = W["out_emb.weight"][prefix] + W["out_pos.weight"][:T]; causal = np.tril(np.ones((T, T), dtype=bool))[None]
46
+ for i in range(self.cfg["n_dec"]):
47
+ p = f"dec.{i}"; y = self._ln(x, p + ".ln1"); x = x + self._mha(y, y, p + ".self_att", causal); x = x + self._mha(self._ln(x, p + ".ln2"), mem, p + ".cross", None); x = x + self._ff(self._ln(x, p + ".ln3"), p + ".ff")
48
+ return self._ln(x, "dec_ln")[-1] @ W["out_emb.weight"].T
49
+ def predict_raw(self, text):
50
+ t = normalize(text); ids = self.tok.encode_in(t, self.max_in) or [self.tok.in_idx[" "]]
51
+ mem = self.encode(np.array(ids)); seq, logp, nt, alts = [BOS], 0.0, 0, None
52
+ for _ in range(self.max_out - 1):
53
+ logits = self.decode_step(np.array(seq), mem); allowed = self.gram.allowed(seq[1:], t) or [EOS]
54
+ p = softmax(logits[allowed]); j = int(p.argmax())
55
+ if alts is None: alts = [(self.tok.out_vocab[allowed[k]], float(p[k])) for k in np.argsort(-p)[:3]]
56
+ logp += math.log(max(p[j], 1e-12)); nt += 1; seq.append(allowed[j])
57
+ if allowed[j] == EOS: break
58
+ return snap_target(text, self.tok.decode_out(seq)), math.exp(logp / max(nt, 1)), t, alts
59
+ def predict(self, text):
60
+ t0 = time.perf_counter(); canon, conf, norm, alts = self.predict_raw(text)
61
+ out = to_json(canon, text)
62
+ out["_meta"] = {"canonical": canon, "confidence": round(conf, 4), "normalized_input": norm, "latency_ms": round((time.perf_counter() - t0) * 1000, 1),
63
+ "risk": ACTIONS.get(out["action"], {}).get("risk", "safe"), "alternatives": [{"action": a, "p": round(p, 4)} for a, p in alts]}
64
+ return out
65
+
66
+ def to_json(canon, raw_text=None):
67
+ parts = canon.split(" ", 1); action = parts[0]; out = {"action": action}
68
+ if len(parts) > 1:
69
+ for m in re.finditer(r'(\w+)=("[^"]*"|\S+)', parts[1]):
70
+ k, v = m.group(1), m.group(2); ty = slot_type(action, k) if action in ACTIONS and k in __import__("catalog").SLOT_TYPES else "text"
71
+ if v.startswith('"'):
72
+ v = v[1:-1]; out[k] = recover_case(raw_text, v) if raw_text else v
73
+ elif ty == "int" and v.isdigit(): out[k] = int(v)
74
+ else: out[k] = v
75
+ return out
model/snap.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Post-decode repair: extend a free-text value that was cut mid-word (letters/digits only) to the full word in the input."""
2
+ import re
3
+ from normalize import normalize
4
+ AN = re.compile(r"[a-z0-9ऀ-ॿ]")
5
+ def _occurrences(t, v):
6
+ i = t.find(v); out = []
7
+ while i >= 0: out.append(i); i = t.find(v, i + 1)
8
+ return out
9
+ def snap_value(t, v):
10
+ if not v or not AN.match(v[0]) and not AN.match(v[-1]): return v
11
+ best = None
12
+ for i in _occurrences(t, v):
13
+ j = i + len(v); a, b = i, j
14
+ while b < len(t) and AN.match(t[b]) and AN.match(t[b-1]): b += 1
15
+ while a > 0 and AN.match(t[a-1]) and AN.match(t[a]): a -= 1
16
+ left_ok = (a == i) # this occurrence already starts on a word boundary
17
+ cand = t[a:b]
18
+ score = (left_ok, -(len(cand) - len(v))) # prefer boundary-aligned, then minimal extension
19
+ if best is None or score > best[0]: best = (score, cand)
20
+ return best[1] if best else v
21
+ TOKEN_SLOTS = {"ssid", "password"} # wifi credentials never start/end in the middle of a whitespace-delimited token
22
+ TOKEN_ACTIONS = ("connect_wifi", "hotspot_on", "forget_wifi", "show_wifi_password") # not web_login: user:pass / user/pass are one token there
23
+ SEP = "/:" # ssid/pass and ssid:pass are one token
24
+ def snap_token(t, v):
25
+ """Extend a credential value to whole whitespace tokens (drops trailing , ;)."""
26
+ if not v or v not in t: return v
27
+ best = None
28
+ for i in _occurrences(t, v):
29
+ a, b = i, i + len(v)
30
+ while a > 0 and not t[a-1].isspace() and t[a-1] not in SEP: a -= 1
31
+ while b < len(t) and not t[b].isspace() and t[b] not in SEP: b += 1
32
+ cand = t[a:i] + v + t[i+len(v):b].rstrip(",;.")
33
+ if len(cand) < len(v): cand = v
34
+ score = (a == i and b == i + len(v), -(len(cand) - len(v)))
35
+ if best is None or score > best[0]: best = (score, cand)
36
+ return best[1]
37
+ def snap_target(text, target):
38
+ t = normalize(text); wifi = target.startswith(TOKEN_ACTIONS)
39
+ def fix(m):
40
+ k, v = m.group(1), m.group(2)
41
+ v = snap_value(t, v)
42
+ if k in TOKEN_SLOTS and wifi: v = snap_token(t, v)
43
+ return f'{k}="{v}"'
44
+ return re.sub(r'(\w+)="([^"]*)"', fix, target)
45
+ if __name__ == "__main__":
46
+ import json, sys
47
+ run, name = sys.argv[1], sys.argv[2]
48
+ R = [json.loads(l) for l in open(f"{run}/eval/{name}.jsonl")]
49
+ before = sum(r["ok"] for r in R); fixed = broke = 0
50
+ for r in R:
51
+ s = snap_target(r["text"], r["pred"])
52
+ if s == r["target"] and not r["ok"]: fixed += 1; print(" FIXED:", r["text"][:55], "|", r["pred"][:55], "->", s[:55])
53
+ if s != r["target"] and r["ok"]: broke += 1; print(" BROKE:", r["text"][:55], "|", r["pred"][:55], "->", s[:55])
54
+ print(f"{name}: exact {before/len(R):.4f} -> {(before+fixed-broke)/len(R):.4f} fixed {fixed} broke {broke}")
model/tokenizer.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Input: characters (lowercased, Devanagari allowed). Output: hybrid tokens
3
+ - one token per action 'set_volume'
4
+ - one token per enum slot+value 'app=chrome', 'unit=min', 'action=set_volume'
5
+ - one token per int/text/time slot key 'value=', 'query=', 'time='
6
+ - character tokens for digits / free text; '"' delimits free text
7
+ """
8
+ import re, sys, os
9
+ HERE = os.path.dirname(os.path.abspath(__file__)); sys.path.insert(0, HERE)
10
+ from catalog import ACTIONS, ENUMS, SLOT_TYPES, ACTION_SLOT_TYPES, slot_type # noqa
11
+
12
+ PAD, BOS, EOS, UNK = 0, 1, 2, 3
13
+ SPECIALS = ["<pad>", "<bos>", "<eos>", "<unk>"]
14
+ TEXT_CHARS = list(" abcdefghijklmnopqrstuvwxyz0123456789.,?!'%+-:/_@#&()*=;$~<>[]|\\{}^")
15
+ IN_CHARS = TEXT_CHARS + ['"', "`"] + [chr(c) for c in range(0x0900, 0x097F)]
16
+
17
+
18
+ class Tokenizer:
19
+ def __init__(self):
20
+ self.in_vocab = SPECIALS + list(dict.fromkeys(IN_CHARS))
21
+ self.in_idx = {c: i for i, c in enumerate(self.in_vocab)}
22
+ out = list(SPECIALS)
23
+ self.action_tokens = list(ACTIONS.keys())
24
+ out += self.action_tokens
25
+ self.enum_tokens = {}
26
+ for slot, ty in SLOT_TYPES.items():
27
+ if ty == "enum":
28
+ for v in ENUMS[slot]:
29
+ tok = f"{slot}={v}"; self.enum_tokens[tok] = (slot, v); out.append(tok)
30
+ # a key token exists for every slot that is int/text/time in ANY action (global type or override)
31
+ keyed = {s for s, ty in SLOT_TYPES.items() if ty != "enum"} | {k.split(".")[1] for k, ty in ACTION_SLOT_TYPES.items() if ty != "enum"}
32
+ self.key_tokens = [f"{s}=" for s in sorted(keyed)]
33
+ out += self.key_tokens
34
+ out.append('"')
35
+ self.char_tokens = TEXT_CHARS
36
+ out += [f"c:{c}" for c in TEXT_CHARS]
37
+ self.out_vocab = out
38
+ self.out_idx = {t: i for i, t in enumerate(out)}
39
+ self.quote = self.out_idx['"']
40
+ self.char_id = {c: self.out_idx[f"c:{c}"] for c in TEXT_CHARS}
41
+ self.digit_ids = [self.char_id[str(d)] for d in range(10)]
42
+
43
+ def encode_in(self, text, max_len=128):
44
+ return [self.in_idx.get(c, UNK) for c in text[:max_len]]
45
+
46
+ def encode_out(self, target):
47
+ toks = [BOS]
48
+ parts = target.split(" ", 1)
49
+ action = parts[0]
50
+ toks.append(self.out_idx[action])
51
+ if len(parts) > 1:
52
+ for m in re.finditer(r'(\w+)=("[^"]*"|\S+)', parts[1]):
53
+ k, v = m.group(1), m.group(2)
54
+ ty = slot_type(action, k)
55
+ if ty == "enum":
56
+ toks.append(self.out_idx[f"{k}={v}"])
57
+ elif ty == "int":
58
+ toks.append(self.out_idx[f"{k}="]); toks += [self.char_id[d] for d in v]
59
+ elif ty == "time":
60
+ toks.append(self.out_idx[f"{k}="]); toks += [self.char_id[c] for c in v.strip('"')]
61
+ else:
62
+ toks.append(self.out_idx[f"{k}="]); toks.append(self.quote)
63
+ toks += [self.char_id.get(c, self.char_id["?"]) for c in v[1:-1]]
64
+ toks.append(self.quote)
65
+ toks.append(EOS)
66
+ return toks
67
+
68
+ def decode_out(self, ids):
69
+ s, in_text = [], False
70
+ for i in ids:
71
+ if i in (BOS, PAD):
72
+ continue
73
+ if i == EOS:
74
+ break
75
+ t = self.out_vocab[i]
76
+ if t == '"':
77
+ s.append('"'); in_text = not in_text
78
+ elif t.startswith("c:"):
79
+ s.append(t[2:])
80
+ elif t in self.enum_tokens or t in self.key_tokens:
81
+ s.append(" " + t)
82
+ else:
83
+ s.append(t)
84
+ return "".join(s)
85
+
86
+ def to_json_dict(self):
87
+ return {"in_vocab": self.in_vocab, "out_vocab": self.out_vocab}
pytorch/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d58de968346270a752718cc2af71f924226635b6c22b82c030f957fda63f978b
3
+ size 25804315
pytorch/model.py ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Tiny char-level Transformer encoder-decoder (pre-LN), written by hand so the numpy runtime can mirror it exactly."""
2
+ import math
3
+ import torch
4
+ import torch.nn as nn
5
+ import torch.nn.functional as F
6
+
7
+
8
+ class MHA(nn.Module):
9
+ def __init__(self, d, h):
10
+ super().__init__()
11
+ self.h, self.dk = h, d // h
12
+ self.q = nn.Linear(d, d); self.k = nn.Linear(d, d); self.v = nn.Linear(d, d); self.o = nn.Linear(d, d)
13
+
14
+ def forward(self, x, mem, mask):
15
+ B, T, D = x.shape
16
+ S = mem.shape[1]
17
+ q = self.q(x).view(B, T, self.h, self.dk).transpose(1, 2)
18
+ k = self.k(mem).view(B, S, self.h, self.dk).transpose(1, 2)
19
+ v = self.v(mem).view(B, S, self.h, self.dk).transpose(1, 2)
20
+ y = F.scaled_dot_product_attention(q, k, v, attn_mask=mask)
21
+ return self.o(y.transpose(1, 2).reshape(B, T, D))
22
+
23
+
24
+ class FF(nn.Module):
25
+ def __init__(self, d, f, p):
26
+ super().__init__()
27
+ self.a = nn.Linear(d, f); self.b = nn.Linear(f, d); self.drop = nn.Dropout(p)
28
+
29
+ def forward(self, x):
30
+ return self.b(self.drop(F.gelu(self.a(x))))
31
+
32
+
33
+ class EncLayer(nn.Module):
34
+ def __init__(self, d, h, f, p):
35
+ super().__init__()
36
+ self.ln1 = nn.LayerNorm(d); self.att = MHA(d, h); self.ln2 = nn.LayerNorm(d); self.ff = FF(d, f, p); self.drop = nn.Dropout(p)
37
+
38
+ def forward(self, x, mask):
39
+ y = self.ln1(x)
40
+ x = x + self.drop(self.att(y, y, mask))
41
+ return x + self.drop(self.ff(self.ln2(x)))
42
+
43
+
44
+ class DecLayer(nn.Module):
45
+ def __init__(self, d, h, f, p):
46
+ super().__init__()
47
+ self.ln1 = nn.LayerNorm(d); self.self_att = MHA(d, h)
48
+ self.ln2 = nn.LayerNorm(d); self.cross = MHA(d, h)
49
+ self.ln3 = nn.LayerNorm(d); self.ff = FF(d, f, p); self.drop = nn.Dropout(p)
50
+
51
+ def forward(self, x, mem, self_mask, cross_mask):
52
+ y = self.ln1(x)
53
+ x = x + self.drop(self.self_att(y, y, self_mask))
54
+ x = x + self.drop(self.cross(self.ln2(x), mem, cross_mask))
55
+ return x + self.drop(self.ff(self.ln3(x)))
56
+
57
+
58
+ class Seq2Seq(nn.Module):
59
+ def __init__(self, n_in, n_out, d=192, h=4, f=512, n_enc=4, n_dec=2, max_in=96, max_out=64, p=0.1):
60
+ super().__init__()
61
+ self.cfg = dict(n_in=n_in, n_out=n_out, d=d, h=h, f=f, n_enc=n_enc, n_dec=n_dec, max_in=max_in, max_out=max_out, p=p)
62
+ self.in_emb = nn.Embedding(n_in, d); self.in_pos = nn.Embedding(max_in, d)
63
+ self.out_emb = nn.Embedding(n_out, d); self.out_pos = nn.Embedding(max_out, d)
64
+ self.enc = nn.ModuleList([EncLayer(d, h, f, p) for _ in range(n_enc)])
65
+ self.dec = nn.ModuleList([DecLayer(d, h, f, p) for _ in range(n_dec)])
66
+ self.enc_ln = nn.LayerNorm(d); self.dec_ln = nn.LayerNorm(d)
67
+ self.drop = nn.Dropout(p)
68
+ self.scale = math.sqrt(d)
69
+ for m in self.modules():
70
+ if isinstance(m, nn.Linear):
71
+ nn.init.normal_(m.weight, std=0.02); nn.init.zeros_(m.bias)
72
+ elif isinstance(m, nn.Embedding):
73
+ nn.init.normal_(m.weight, std=0.02)
74
+
75
+ def encode(self, src):
76
+ B, S = src.shape
77
+ pad = (src == 0)
78
+ mask = (~pad)[:, None, None, :] # True = attend
79
+ x = self.drop(self.in_emb(src) + self.in_pos(torch.arange(S, device=src.device)))
80
+ for l in self.enc:
81
+ x = l(x, mask)
82
+ return self.enc_ln(x), mask
83
+
84
+ def decode(self, tgt, mem, mem_mask):
85
+ B, T = tgt.shape
86
+ causal = torch.ones(T, T, dtype=torch.bool, device=tgt.device).tril()[None, None]
87
+ x = self.drop(self.out_emb(tgt) + self.out_pos(torch.arange(T, device=tgt.device)))
88
+ for l in self.dec:
89
+ x = l(x, mem, causal, mem_mask)
90
+ x = self.dec_ln(x)
91
+ return x @ self.out_emb.weight.t() # tied output projection
92
+
93
+ def forward(self, src, tgt_in):
94
+ mem, mm = self.encode(src)
95
+ return self.decode(tgt_in, mem, mm)
96
+
97
+
98
+ def n_params(m):
99
+ return sum(p.numel() for p in m.parameters())
quickstart.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Parse commands and show what the sample executor would run. Nothing is executed.
2
+ python quickstart.py "volume 40 kar do" "connect to wifi Redmi Note 12 password hello@123"
3
+ python quickstart.py # interactive
4
+ """
5
+ import json, os, platform, sys
6
+ # small matrices: a few BLAS threads are much faster than one per core (see eval/BENCHMARK.md). Must be set before numpy loads.
7
+ _threads = "2" if platform.machine().lower() in ("aarch64", "arm64") else "4"
8
+ os.environ.setdefault("OPENBLAS_NUM_THREADS", _threads); os.environ.setdefault("OMP_NUM_THREADS", _threads)
9
+ HERE = os.path.dirname(os.path.abspath(__file__))
10
+ sys.path.insert(0, os.path.join(HERE, "model")); sys.path.insert(0, os.path.join(HERE, "executor"))
11
+ from runtime import CommandModel # noqa: E402
12
+ import executor as EX # noqa: E402
13
+
14
+ model = CommandModel(os.path.join(HERE, "model"))
15
+
16
+ def show(text):
17
+ out = model.predict(text); meta = out.pop("_meta")
18
+ plan = EX.plan(out, None, text) # None = this machine's platform; text lets it ask about bare GPIO pins
19
+ print(json.dumps({"text": text, "command": out, "confidence": meta["confidence"], "latency_ms": meta["latency_ms"],
20
+ "risk": plan.risk, "plan": plan.action, "would_run": plan.command or plan.note}, ensure_ascii=False, indent=1))
21
+
22
+ if len(sys.argv) > 1:
23
+ for t in sys.argv[1:]: show(t)
24
+ else:
25
+ print("type a command (empty line to quit)")
26
+ while True:
27
+ t = input("> ").strip()
28
+ if not t: break
29
+ show(t)
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ numpy>=1.24
2
+ fastapi>=0.100
3
+ uvicorn>=0.23
4
+ pydantic>=2
run.bat ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @echo off
2
+ rem Start the test UI on Windows. Usage: run.bat [port] | run.bat cli | run.bat report | run.bat test [--full] | run.bat install <trained.zip>
3
+ cd /d "%~dp0"
4
+ set PORT=%1
5
+ if "%PORT%"=="" set PORT=8000
6
+ if not exist .venv ( python -m venv .venv || ( echo Python 3.9+ required: https://python.org & pause & exit /b 1 ) )
7
+ call .venv\Scripts\activate.bat
8
+ python -c "import numpy,fastapi,uvicorn" 2>nul || pip install -q -r requirements.txt
9
+ if "%1"=="cli" ( python ui\cli.py & exit /b )
10
+ if "%1"=="report" ( python eval\make_report.py & exit /b )
11
+ if "%1"=="test" ( python eval\smoke_test.py %2 & exit /b )
12
+ if "%1"=="install" ( python tools\install_model.py "%~2" & exit /b )
13
+ echo Union Command Agent UI -^> http://localhost:%PORT% (Ctrl+C to stop)
14
+ start "" http://localhost:%PORT%
15
+ set PORT=%PORT%
16
+ python ui\app.py
run.sh ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ # Start the test UI (Linux / Raspberry Pi / macOS). Usage: ./run.sh [port] | ./run.sh cli | ./run.sh report | ./run.sh test [--full] | ./run.sh install <trained.zip>
3
+ cd "$(dirname "$0")"
4
+ PORT="${1:-8000}"
5
+ if [ ! -d .venv ]; then python3 -m venv .venv || { echo "python3-venv missing: sudo apt install python3-venv"; exit 1; }; fi
6
+ . .venv/bin/activate
7
+ python -c "import numpy,fastapi,uvicorn" 2>/dev/null || pip install -q -r requirements.txt
8
+ if [ "$1" = "cli" ]; then python ui/cli.py; exit; fi
9
+ if [ "$1" = "report" ]; then python eval/make_report.py; exit; fi
10
+ if [ "$1" = "test" ]; then python eval/smoke_test.py $2; exit; fi
11
+ if [ "$1" = "install" ]; then python tools/install_model.py "$2"; exit; fi
12
+ echo "Union Command Agent UI -> http://localhost:$PORT (Ctrl+C to stop)"
13
+ ( sleep 2; xdg-open "http://localhost:$PORT" >/dev/null 2>&1 || true ) &
14
+ PORT=$PORT python ui/app.py
tools/install_model.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Install a model trained on Colab into this agent.
2
+ python tools/install_model.py path/to/union-agent-trained.zip
3
+ - backs up the current model/ to model_backup_<timestamp>/
4
+ - copies model.npz + config.json from the zip's export/ into model/ (runtime code in model/ is kept)
5
+ - copies the zip's eval summary to eval/model_eval_summary.json (used by the report) and train log to training/
6
+ - runs a quick load + 3-prompt sanity check
7
+ Roll back: delete model/ and rename the backup folder to model/.
8
+ """
9
+ import json, os, shutil, sys, time, zipfile
10
+ HERE = os.path.dirname(os.path.abspath(__file__)); ROOT = os.path.dirname(HERE)
11
+
12
+ def main(zpath):
13
+ if not os.path.exists(zpath): sys.exit(f"not found: {zpath}")
14
+ z = zipfile.ZipFile(zpath)
15
+ names = z.namelist()
16
+ def find(suffix):
17
+ c = [n for n in names if n.endswith(suffix) and "__MACOSX" not in n]
18
+ return min(c, key=len) if c else None
19
+ npz, cfg, summ, log = find("model.npz"), find("config.json"), find("eval/summary.json"), find("train_log.jsonl")
20
+ if not npz or not cfg: sys.exit("zip has no model.npz/config.json (expected the export/ folder from the Colab notebook)")
21
+ cfg_new = json.loads(z.read(cfg))
22
+ need = {"n_in", "n_out", "d", "h", "f", "n_enc", "n_dec", "max_in", "max_out"}
23
+ if not need <= set(cfg_new): sys.exit(f"{cfg} is not a model config (missing {need - set(cfg_new)})")
24
+ cur_cfg = json.load(open(os.path.join(ROOT, "model", "config.json")))
25
+ if (cfg_new["n_in"], cfg_new["n_out"]) != (cur_cfg["n_in"], cur_cfg["n_out"]):
26
+ sys.exit(f"vocab mismatch: new model n_in/n_out {cfg_new['n_in']}/{cfg_new['n_out']} vs agent {cur_cfg['n_in']}/{cur_cfg['n_out']} "
27
+ "(model trained with a different tokenizer/catalog; copy the whole export/ folder over model/ instead)")
28
+ bak = os.path.join(ROOT, "model_backup_" + time.strftime("%Y%m%d_%H%M%S"))
29
+ shutil.copytree(os.path.join(ROOT, "model"), bak, ignore=shutil.ignore_patterns("__pycache__"))
30
+ open(os.path.join(ROOT, "model", "model.npz"), "wb").write(z.read(npz))
31
+ json.dump({k: cfg_new[k] for k in need}, open(os.path.join(ROOT, "model", "config.json"), "w"), indent=1)
32
+ if summ: open(os.path.join(ROOT, "eval", "model_eval_summary.json"), "wb").write(z.read(summ))
33
+ if log: open(os.path.join(ROOT, "training", "train_log_colab.jsonl"), "wb").write(z.read(log))
34
+ print(f"installed {npz} (d={cfg_new['d']}, enc={cfg_new['n_enc']}, dec={cfg_new['n_dec']}); previous model backed up to {os.path.basename(bak)}")
35
+ sys.path.insert(0, os.path.join(ROOT, "model"))
36
+ from runtime import CommandModel
37
+ m = CommandModel(os.path.join(ROOT, "model"))
38
+ print("params:", sum(v.size for v in m.W.values()))
39
+ for p in ("awaaz pachaas pe rakh do", "wifi Airtel_5G se connect karo password Wifi@2024", "board pin 11 pe led jalao"):
40
+ o = m.predict(p); print(" ", p, "->", {k: v for k, v in o.items() if k != "_meta"})
41
+ if summ:
42
+ s = json.loads(z.read(summ))
43
+ for k in ("val", "test_strict", "curated", "wifi_holdout"):
44
+ if k in s: print(f" {k:14s} exact {s[k]['exact']*100:.2f}% action {s[k]['action']*100:.2f}%")
45
+ print("next: ./run.sh test and ./run.sh report (Windows: run.bat test / run.bat report)")
46
+
47
+ if __name__ == "__main__":
48
+ if len(sys.argv) != 2: sys.exit(__doc__)
49
+ main(sys.argv[1])
ui/app.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Test UI + API for the union command agent. python ui/app.py -> http://localhost:8000
2
+ Model (numpy runtime) -> executor plan (dry-run by default) -> optional execution with risk gating."""
3
+ import json, os, sys, platform as _pf
4
+ HERE = os.path.dirname(os.path.abspath(__file__)); ROOT = os.path.dirname(HERE)
5
+ sys.path.insert(0, os.path.join(ROOT, "model")); sys.path.insert(0, os.path.join(ROOT, "executor"))
6
+ from fastapi import FastAPI # noqa
7
+ from fastapi.responses import HTMLResponse, JSONResponse # noqa
8
+ from pydantic import BaseModel # noqa
9
+ from runtime import CommandModel # noqa
10
+ import executor as EX # noqa
11
+
12
+ MODEL = CommandModel(os.path.join(ROOT, "model"))
13
+ CAT = EX.CATALOG
14
+ app = FastAPI(title="union command agent")
15
+
16
+ class Req(BaseModel):
17
+ text: str; platform: str = "auto"; execute: bool = False; allow_caution: bool = False; confirm: str = ""
18
+ class Batch(BaseModel):
19
+ texts: list; platform: str = "auto"
20
+
21
+ def _plat(p): return EX.platform_name() if p in ("auto", "", None) else ("win" if p.startswith("win") else "pi")
22
+
23
+ def handle(text, platform="auto", execute=False, allow_caution=False, confirm=""):
24
+ plat = _plat(platform); out = MODEL.predict(text); cmd = {k: v for k, v in out.items() if k != "_meta"}
25
+ p = EX.plan(cmd, plat, text); ok, why = EX.gate(p, allow_caution, confirm or None)
26
+ res = {"text": text, "platform": plat, "model": cmd, "meta": out["_meta"], "plan": p.to_dict(), "gate": {"ok": ok, "reason": why}, "spec": CAT.get(cmd["action"], {}), "run": None}
27
+ if execute:
28
+ res["run"] = EX.run(p, cmd, dry_run=False) if ok else {"status": "blocked", "output": why, "command": p.command}
29
+ return res
30
+
31
+ @app.get("/", response_class=HTMLResponse)
32
+ def index(): return open(os.path.join(HERE, "static", "index.html"), encoding="utf-8").read()
33
+ @app.get("/api/info")
34
+ def info(): return {"actions": len(CAT), "host": _pf.node(), "os": _pf.system(), "platform": EX.platform_name(), "model_params": int(sum(v.size for v in MODEL.W.values()))}
35
+ @app.get("/api/prompts")
36
+ def prompts(): return json.load(open(os.path.join(HERE, "prompts.json"), encoding="utf-8"))
37
+ @app.get("/api/catalog")
38
+ def catalog(): return CAT
39
+ @app.post("/api/predict")
40
+ def predict(r: Req): return handle(r.text, r.platform, r.execute, r.allow_caution, r.confirm)
41
+ @app.post("/api/batch")
42
+ def batch(b: Batch): return [handle(t, b.platform) for t in b.texts if t.strip()]
43
+
44
+ if __name__ == "__main__":
45
+ import uvicorn
46
+ uvicorn.run(app, host="127.0.0.1", port=int(os.environ.get("PORT", 8000)))
ui/cli.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Terminal agent: type a command, see the parse + plan, confirm to execute."""
2
+ import os, sys, json
3
+ ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
4
+ sys.path.insert(0, os.path.join(ROOT, "model")); sys.path.insert(0, os.path.join(ROOT, "executor"))
5
+ from runtime import CommandModel; import executor as EX
6
+ m = CommandModel(os.path.join(ROOT, "model")); print(f"union command agent · {len(EX.CATALOG)} actions · platform {EX.platform_name()} · type 'quit' to exit")
7
+ while True:
8
+ try: t = input("\n> ").strip()
9
+ except (EOFError, KeyboardInterrupt): break
10
+ if not t or t in ("quit", "exit"): break
11
+ out = m.predict(t); cmd = {k: v for k, v in out.items() if k != "_meta"}; p = EX.plan(cmd, None, t)
12
+ print(json.dumps(cmd, ensure_ascii=False), f"(conf {out['_meta']['confidence']:.2f}, risk {p.risk})")
13
+ if not p.supported: print(" ", p.note); continue
14
+ print(f" [{p.kind}] {p.command}")
15
+ if p.kind == "py" and p.action in ("unknown", "clarify"): print(" ", EX.run(p, cmd, dry_run=False)["output"]); continue
16
+ conf = input(f" run it? (y / type '{p.action}' if critical / n) ").strip()
17
+ ok, why = EX.gate(p, allow_caution=conf.lower() == "y", confirm_text=conf)
18
+ if not ok and conf.lower() != "y": print(" ", why); continue
19
+ r = EX.run(p, cmd, dry_run=False); print(f" {r['status']}: {r['output'][:600]}")
ui/prompts.json ADDED
@@ -0,0 +1,2306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "examples": [
3
+ "volume level 60!",
4
+ "bhaiya vloume badhao please",
5
+ "i have a meeting so silent mode chalu karo!!",
6
+ "please brightness please 49 kar dena na",
7
+ "yaar turn on blue light filter",
8
+ "switch to darkmode thank you",
9
+ "hey turn off the mera computer?",
10
+ "machine dobara chalu karo",
11
+ "zara please abort the scheduled shutdown abhi",
12
+ "bhai ab screen ko lock kar dena abhi",
13
+ "laptop sleep thank you",
14
+ "zara ab wireless ko chalu kar dena abhi",
15
+ "hey pi ACT-Fibernet wifi pe swiitch karo",
16
+ "hotspot on kar do plz",
17
+ "aas paas ke wf dikhao",
18
+ "what is my ip address.",
19
+ "laptop what ip does the internet see",
20
+ "hey computer please ping the host raspberrypi.local kar sakte ho",
21
+ "mbps kitna aa raha hai jaldi",
22
+ "please pair my airpods turant",
23
+ "kindly please launch the task manager window na",
24
+ "edge close, baccha ro raha hai",
25
+ "claude site le aao",
26
+ "internet pe lata mangeshkar search kr do turant",
27
+ "hi youtube pe horror example where shaam dikhao",
28
+ "zomato open karke , cred design_ritu/Star#999 se sign in kar do",
29
+ "new tab in browser abhi",
30
+ "i am done for today toh dictate dear sir?",
31
+ "screenshot kr de main so raha hoon",
32
+ "download launch karo",
33
+ "hey computer \"demo/report17.txt\" wala folder bana dena thanks",
34
+ "kindly \"demo/report0.txt\" file ke andar ka text bata dena please",
35
+ "boss make a copy of \"bill march.py\" at videos/old/photo.csv",
36
+ "\"pm kisan_backup\" remove kar",
37
+ "look for file bhav dutskusskan garmi on my computer abhi ke abhi",
38
+ "make a zip of project backup",
39
+ "zara tell me the installed operating system version zara",
40
+ "could you pi ki chip abhi kitni garam hai zara",
41
+ "what is the throttled",
42
+ "guest aaye hain cpu load usage kitna hai",
43
+ "free ram pls",
44
+ "zara tell me available disk storage",
45
+ "HEY COMPUTER PLEASE SHOW CONNECTED USB DEVICES NA",
46
+ "please system ki running process list bata dena for me",
47
+ "zara please end the running process id 7673 na",
48
+ "kindly \"ssh\" service ki current state bata dena thanks",
49
+ "jaldi se docker daemon restart karo pls",
50
+ "python3-pip install karo for me",
51
+ "any new update...",
52
+ "meeting shuru hone wali hai toh kaunse container chal rahe hain",
53
+ "terminal me df -h chalao, call pe hoon",
54
+ "mere liye please set gpio pin 27 to high for me",
55
+ "bhaiya gpio pin 26 low karo",
56
+ "bhai please read the value of gpio pin 27 zara",
57
+ "23 number pin pe pwm eighty percent kar do",
58
+ "sero 24 number pin ajgle 180 jaldi se",
59
+ "pin number 36 ki heater ko 3 baar jhapkao",
60
+ "log edges on gpio 26 jaldi se",
61
+ "hey laptop the pump on 40-pin header pin 32 does not turj on",
62
+ "gpio 4 ko pullup kro yaar",
63
+ "what is the bcm number of pin 31 jaldi se",
64
+ "suno miso kaoon sa pin hai",
65
+ "computer i2c bus scan krdo turant",
66
+ "could you please i2cget 0x76 0x10, battery bachani hai",
67
+ "plz start timr chhaalis minat",
68
+ "raat ho gayi hai toh alarm at 3:15am",
69
+ "can you 253 secs baad call mom ka reminder lagana",
70
+ "3.5 times 4 calculate kzro",
71
+ "client ko bolo slack pe ki happy birthday bhai",
72
+ "ek kaam karo send team.lead@neurealm.com an email saying 5 min me aata hoon",
73
+ "kal dopahar 1 baje doctor visit ka event banao",
74
+ "show me what you can do main so raha hoon",
75
+ "please order groceries online kar sakte ho",
76
+ "run a cotnainer"
77
+ ],
78
+ "all_activities": [
79
+ {
80
+ "prompt": "mujhe kaam karna hai so the usb drive ko boot pe mount krdo",
81
+ "action": "add_persistent_mount",
82
+ "device": "both",
83
+ "risk": "caution"
84
+ },
85
+ {
86
+ "prompt": "flight mde disable",
87
+ "action": "airplane_mode_off",
88
+ "device": "both",
89
+ "risk": "safe"
90
+ },
91
+ {
92
+ "prompt": "jara aeroplane mode mein daal do",
93
+ "action": "airplane_mode_on",
94
+ "device": "both",
95
+ "risk": "caution"
96
+ },
97
+ {
98
+ "prompt": "laptop scan karo virus ke liye...",
99
+ "action": "antivirus_scan",
100
+ "device": "both",
101
+ "risk": "caution"
102
+ },
103
+ {
104
+ "prompt": "mummy bula rahi hai toh reattach to build",
105
+ "action": "attach_session",
106
+ "device": "both",
107
+ "risk": "safe"
108
+ },
109
+ {
110
+ "prompt": "create a disk image of nvme0n1 quickly",
111
+ "action": "backup_disk_image",
112
+ "device": "both",
113
+ "risk": "critical"
114
+ },
115
+ {
116
+ "prompt": "battery saver hatao, call pe hoon",
117
+ "action": "battery_saver_off",
118
+ "device": "both",
119
+ "risk": "safe"
120
+ },
121
+ {
122
+ "prompt": "bhai battery saver mode start karna",
123
+ "action": "battery_saver_on",
124
+ "device": "both",
125
+ "risk": "safe"
126
+ },
127
+ {
128
+ "prompt": "bcm 11 physical pin kaun sa hai",
129
+ "action": "bcm_to_board",
130
+ "device": "pi",
131
+ "risk": "safe"
132
+ },
133
+ {
134
+ "prompt": "please pair my airpods turant",
135
+ "action": "bluetooth_connect",
136
+ "device": "both",
137
+ "risk": "safe"
138
+ },
139
+ {
140
+ "prompt": "zara ab bluetooth band kar dena abhi",
141
+ "action": "bluetooth_off",
142
+ "device": "both",
143
+ "risk": "caution"
144
+ },
145
+ {
146
+ "prompt": "bluetooth connection chalu kro yaar",
147
+ "action": "bluetooth_on",
148
+ "device": "both",
149
+ "risk": "caution"
150
+ },
151
+ {
152
+ "prompt": "what is the bcm number of pin 31 jaldi se",
153
+ "action": "board_to_bcm",
154
+ "device": "pi",
155
+ "risk": "safe"
156
+ },
157
+ {
158
+ "prompt": "please jaldi is page ko bookmark kar do please",
159
+ "action": "bookmark_page",
160
+ "device": "both",
161
+ "risk": "safe"
162
+ },
163
+ {
164
+ "prompt": "screen dim karo kaam ho gaya",
165
+ "action": "brightness_down",
166
+ "device": "both",
167
+ "risk": "safe"
168
+ },
169
+ {
170
+ "prompt": "inc roshni a little",
171
+ "action": "brightness_up",
172
+ "device": "both",
173
+ "risk": "safe"
174
+ },
175
+ {
176
+ "prompt": "back in the browser, neend aa rahi hai",
177
+ "action": "browser_back",
178
+ "device": "both",
179
+ "risk": "safe"
180
+ },
181
+ {
182
+ "prompt": "agle in the browser",
183
+ "action": "browser_forward",
184
+ "device": "both",
185
+ "risk": "safe"
186
+ },
187
+ {
188
+ "prompt": "ek kaam karo kick off cmake build in ~/models",
189
+ "action": "build_project",
190
+ "device": "both",
191
+ "risk": "caution"
192
+ },
193
+ {
194
+ "prompt": "3.5 times 4 calculate kzro",
195
+ "action": "calculate",
196
+ "device": "both",
197
+ "risk": "safe"
198
+ },
199
+ {
200
+ "prompt": "capture a image because baccha ro raha hai",
201
+ "action": "camera_photo",
202
+ "device": "both",
203
+ "risk": "safe"
204
+ },
205
+ {
206
+ "prompt": "bhaiya camera se 209 min video record karna",
207
+ "action": "camera_video",
208
+ "device": "pi",
209
+ "risk": "safe"
210
+ },
211
+ {
212
+ "prompt": "please jaldi alarm off kar do quickly",
213
+ "action": "cancel_alarm",
214
+ "device": "both",
215
+ "risk": "safe"
216
+ },
217
+ {
218
+ "prompt": "zara please abort the scheduled shutdown abhi",
219
+ "action": "cancel_shutdown",
220
+ "device": "both",
221
+ "risk": "caution"
222
+ },
223
+ {
224
+ "prompt": "main bahar ja raha hoon, timer cancel karo zara",
225
+ "action": "cancel_timer",
226
+ "device": "both",
227
+ "risk": "safe"
228
+ },
229
+ {
230
+ "prompt": "hello ai hat dikha",
231
+ "action": "check_ai_accelerator",
232
+ "device": "pi",
233
+ "risk": "safe"
234
+ },
235
+ {
236
+ "prompt": "ek kaam karo mmcblk0 pe fsck run karo",
237
+ "action": "check_filesystem",
238
+ "device": "both",
239
+ "risk": "critical"
240
+ },
241
+ {
242
+ "prompt": "call aane wala hai, 8.8.8.8 ka port 22 check kar dena na",
243
+ "action": "check_port",
244
+ "device": "both",
245
+ "risk": "safe"
246
+ },
247
+ {
248
+ "prompt": "any new update...",
249
+ "action": "check_updates",
250
+ "device": "both",
251
+ "risk": "safe"
252
+ },
253
+ {
254
+ "prompt": "run a cotnainer",
255
+ "action": "clarify",
256
+ "device": "both",
257
+ "risk": "safe"
258
+ },
259
+ {
260
+ "prompt": "jaldi se notifications saaf kar asap",
261
+ "action": "clear_notifications",
262
+ "device": "both",
263
+ "risk": "safe"
264
+ },
265
+ {
266
+ "prompt": "can you wipe cache files",
267
+ "action": "clear_temp_files",
268
+ "device": "both",
269
+ "risk": "critical"
270
+ },
271
+ {
272
+ "prompt": "give me copied items abhi ke abhi",
273
+ "action": "clipboard_history",
274
+ "device": "both",
275
+ "risk": "safe"
276
+ },
277
+ {
278
+ "prompt": "sd card ko sda1 pe clone krdo",
279
+ "action": "clone_disk",
280
+ "device": "both",
281
+ "risk": "critical"
282
+ },
283
+ {
284
+ "prompt": "edge close, baccha ro raha hai",
285
+ "action": "close_app",
286
+ "device": "both",
287
+ "risk": "caution"
288
+ },
289
+ {
290
+ "prompt": "ok google close this tab",
291
+ "action": "close_tab",
292
+ "device": "both",
293
+ "risk": "safe"
294
+ },
295
+ {
296
+ "prompt": "ek kaam karo close this",
297
+ "action": "close_window",
298
+ "device": "both",
299
+ "risk": "caution"
300
+ },
301
+ {
302
+ "prompt": "make a zip of project backup",
303
+ "action": "compress_file",
304
+ "device": "both",
305
+ "risk": "safe"
306
+ },
307
+ {
308
+ "prompt": "hey pi ACT-Fibernet wifi pe swiitch karo",
309
+ "action": "connect_wifi",
310
+ "device": "both",
311
+ "risk": "caution"
312
+ },
313
+ {
314
+ "prompt": "test.wav ko flac me convert kar do plz",
315
+ "action": "convert_media",
316
+ "device": "both",
317
+ "risk": "caution"
318
+ },
319
+ {
320
+ "prompt": "copy selected text jaldi se",
321
+ "action": "copy",
322
+ "device": "both",
323
+ "risk": "safe"
324
+ },
325
+ {
326
+ "prompt": "boss make a copy of \"bill march.py\" at videos/old/photo.csv",
327
+ "action": "copy_file",
328
+ "device": "both",
329
+ "risk": "caution"
330
+ },
331
+ {
332
+ "prompt": "mere liye 192.168.0.10 ke liye key auth setup karo",
333
+ "action": "copy_ssh_key",
334
+ "device": "both",
335
+ "risk": "caution"
336
+ },
337
+ {
338
+ "prompt": "kal dopahar 1 baje doctor visit ka event banao",
339
+ "action": "create_calendar_event",
340
+ "device": "both",
341
+ "risk": "safe"
342
+ },
343
+ {
344
+ "prompt": "bhaiya new file \"college/old/photo.png\", battery bachani hai",
345
+ "action": "create_file",
346
+ "device": "both",
347
+ "risk": "caution"
348
+ },
349
+ {
350
+ "prompt": "hey computer \"demo/report17.txt\" wala folder bana dena thanks",
351
+ "action": "create_folder",
352
+ "device": "both",
353
+ "risk": "caution"
354
+ },
355
+ {
356
+ "prompt": "make backup start at boot as a service, aankh dukh rahi hai",
357
+ "action": "create_service",
358
+ "device": "both",
359
+ "risk": "critical"
360
+ },
361
+ {
362
+ "prompt": "/opt/app ko /home/pi/start.sh se link krdo",
363
+ "action": "create_symlink",
364
+ "device": "both",
365
+ "risk": "caution"
366
+ },
367
+ {
368
+ "prompt": "~/venv pe virtualenv banao",
369
+ "action": "create_virtualenv",
370
+ "device": "both",
371
+ "risk": "caution"
372
+ },
373
+ {
374
+ "prompt": "please jaldi ctrl x please",
375
+ "action": "cut",
376
+ "device": "both",
377
+ "risk": "safe"
378
+ },
379
+ {
380
+ "prompt": "call aane wala hai so dark mode hatao",
381
+ "action": "dark_mode_off",
382
+ "device": "both",
383
+ "risk": "safe"
384
+ },
385
+ {
386
+ "prompt": "switch to darkmode thank you",
387
+ "action": "dark_mode_on",
388
+ "device": "both",
389
+ "risk": "safe"
390
+ },
391
+ {
392
+ "prompt": "\"pm kisan_backup\" remove kar",
393
+ "action": "delete_file",
394
+ "device": "both",
395
+ "risk": "critical"
396
+ },
397
+ {
398
+ "prompt": "please jaldi disable unattended upgrades",
399
+ "action": "disable_auto_updates",
400
+ "device": "both",
401
+ "risk": "caution"
402
+ },
403
+ {
404
+ "prompt": "local devices discover karna, neend aa rahi hai",
405
+ "action": "discover_devices",
406
+ "device": "both",
407
+ "risk": "safe"
408
+ },
409
+ {
410
+ "prompt": "display duplicate par set karo?",
411
+ "action": "display_mode",
412
+ "device": "both",
413
+ "risk": "safe"
414
+ },
415
+ {
416
+ "prompt": "focus mode band karo right now",
417
+ "action": "dnd_off",
418
+ "device": "both",
419
+ "risk": "safe"
420
+ },
421
+ {
422
+ "prompt": "quiet hours lagao quickly",
423
+ "action": "dnd_on",
424
+ "device": "both",
425
+ "risk": "safe"
426
+ },
427
+ {
428
+ "prompt": "could you please resolve the hostname localhost kar sakte ho",
429
+ "action": "dns_lookup",
430
+ "device": "both",
431
+ "risk": "safe"
432
+ },
433
+ {
434
+ "prompt": "ok google compose stack chalu karo?",
435
+ "action": "docker_compose_up",
436
+ "device": "both",
437
+ "risk": "caution"
438
+ },
439
+ {
440
+ "prompt": "meeting shuru hone wali hai toh kaunse container chal rahe hain",
441
+ "action": "docker_list",
442
+ "device": "both",
443
+ "risk": "safe"
444
+ },
445
+ {
446
+ "prompt": "can you docker space free karna",
447
+ "action": "docker_prune",
448
+ "device": "both",
449
+ "risk": "critical"
450
+ },
451
+ {
452
+ "prompt": "suno grafana ka container start karo",
453
+ "action": "docker_run",
454
+ "device": "both",
455
+ "risk": "caution"
456
+ },
457
+ {
458
+ "prompt": "my-app ko stop kar!",
459
+ "action": "docker_stop",
460
+ "device": "both",
461
+ "risk": "caution"
462
+ },
463
+ {
464
+ "prompt": "computer http://192.168.1.10/firmware.bin download karo right now",
465
+ "action": "download_file",
466
+ "device": "both",
467
+ "risk": "caution"
468
+ },
469
+ {
470
+ "prompt": "hi cached memory free kar dena yaar",
471
+ "action": "drop_caches",
472
+ "device": "both",
473
+ "risk": "critical"
474
+ },
475
+ {
476
+ "prompt": "hi add a line to the boot config",
477
+ "action": "edit_system_config",
478
+ "device": "both",
479
+ "risk": "critical"
480
+ },
481
+ {
482
+ "prompt": "what is emojis thank you",
483
+ "action": "emoji_panel",
484
+ "device": "both",
485
+ "risk": "safe"
486
+ },
487
+ {
488
+ "prompt": "kachra dabba khali kar de for me",
489
+ "action": "empty_recycle_bin",
490
+ "device": "both",
491
+ "risk": "critical"
492
+ },
493
+ {
494
+ "prompt": "install security patches automatically zara",
495
+ "action": "enable_auto_updates",
496
+ "device": "both",
497
+ "risk": "caution"
498
+ },
499
+ {
500
+ "prompt": "movie dekhni hai so make up compressed swap",
501
+ "action": "enable_zram",
502
+ "device": "both",
503
+ "risk": "caution"
504
+ },
505
+ {
506
+ "prompt": "i am done for today toh poora sd card use krdo",
507
+ "action": "expand_filesystem",
508
+ "device": "pi",
509
+ "risk": "critical"
510
+ },
511
+ {
512
+ "prompt": "project.tar.gz ko extract karo asap",
513
+ "action": "extract_archive",
514
+ "device": "both",
515
+ "risk": "safe"
516
+ },
517
+ {
518
+ "prompt": "mere liye please restore factory settings on this computer for me",
519
+ "action": "factory_reset",
520
+ "device": "both",
521
+ "risk": "critical"
522
+ },
523
+ {
524
+ "prompt": "nmap install hai kya pls",
525
+ "action": "find_command",
526
+ "device": "both",
527
+ "risk": "safe"
528
+ },
529
+ {
530
+ "prompt": "mujhe kaam karna hai, find arijit singh songs in the page",
531
+ "action": "find_in_page",
532
+ "device": "both",
533
+ "risk": "safe"
534
+ },
535
+ {
536
+ "prompt": "firewall me port 8000 allow karo for me",
537
+ "action": "firewall_allow",
538
+ "device": "both",
539
+ "risk": "caution"
540
+ },
541
+ {
542
+ "prompt": "plz port 443 rok do firewall me",
543
+ "action": "firewall_deny",
544
+ "device": "both",
545
+ "risk": "critical"
546
+ },
547
+ {
548
+ "prompt": "processor usage usage yaar ki zarurat nahi, firrwal hata do?",
549
+ "action": "firewall_off",
550
+ "device": "both",
551
+ "risk": "critical"
552
+ },
553
+ {
554
+ "prompt": "the firewall turn on thanks",
555
+ "action": "firewall_on",
556
+ "device": "both",
557
+ "risk": "caution"
558
+ },
559
+ {
560
+ "prompt": "system ke firewall ki details bata dena thanks",
561
+ "action": "firewall_status",
562
+ "device": "both",
563
+ "risk": "safe"
564
+ },
565
+ {
566
+ "prompt": "gpio accwss do mere user ko",
567
+ "action": "fix_gpio_permissions",
568
+ "device": "pi",
569
+ "risk": "caution"
570
+ },
571
+ {
572
+ "prompt": "rpi-update start karo bhai",
573
+ "action": "flash_firmware",
574
+ "device": "both",
575
+ "risk": "critical"
576
+ },
577
+ {
578
+ "prompt": "clear dns cache zara",
579
+ "action": "flush_dns",
580
+ "device": "both",
581
+ "risk": "caution"
582
+ },
583
+ {
584
+ "prompt": "online class hai toh forget the network Jio_5G_Home",
585
+ "action": "forget_wifi",
586
+ "device": "both",
587
+ "risk": "caution"
588
+ },
589
+ {
590
+ "prompt": "could you please format my storage device thanks",
591
+ "action": "format_drive",
592
+ "device": "both",
593
+ "risk": "critical"
594
+ },
595
+ {
596
+ "prompt": "full screen kar do abhi",
597
+ "action": "fullscreen",
598
+ "device": "both",
599
+ "risk": "safe"
600
+ },
601
+ {
602
+ "prompt": "mummy bula rahi hai, bandwidth usage",
603
+ "action": "get_bandwidth_usage",
604
+ "device": "both",
605
+ "risk": "safe"
606
+ },
607
+ {
608
+ "prompt": "can you laptop ki battery abhi kitni hai",
609
+ "action": "get_battery",
610
+ "device": "both",
611
+ "risk": "safe"
612
+ },
613
+ {
614
+ "prompt": "which firmware settings are active na",
615
+ "action": "get_boot_config",
616
+ "device": "pi",
617
+ "risk": "safe"
618
+ },
619
+ {
620
+ "prompt": "last boot ka log dikhana turant",
621
+ "action": "get_boot_logs",
622
+ "device": "both",
623
+ "risk": "safe"
624
+ },
625
+ {
626
+ "prompt": "padhai karni hai, boot time ji",
627
+ "action": "get_boot_time",
628
+ "device": "both",
629
+ "risk": "safe"
630
+ },
631
+ {
632
+ "prompt": "can you screen brightness abhi kitni hai",
633
+ "action": "get_brightness",
634
+ "device": "both",
635
+ "risk": "safe"
636
+ },
637
+ {
638
+ "prompt": "zara tell me the current pi cpu frequency abhi",
639
+ "action": "get_cpu_clock",
640
+ "device": "pi",
641
+ "risk": "safe"
642
+ },
643
+ {
644
+ "prompt": "call aane wala hai so what governor is set",
645
+ "action": "get_cpu_governor",
646
+ "device": "pi",
647
+ "risk": "safe"
648
+ },
649
+ {
650
+ "prompt": "give me cpu pressure turant",
651
+ "action": "get_cpu_pressure",
652
+ "device": "both",
653
+ "risk": "safe"
654
+ },
655
+ {
656
+ "prompt": "guest aaye hain cpu load usage kitna hai",
657
+ "action": "get_cpu_usage",
658
+ "device": "both",
659
+ "risk": "safe"
660
+ },
661
+ {
662
+ "prompt": "current user batao.",
663
+ "action": "get_current_user",
664
+ "device": "both",
665
+ "risk": "safe"
666
+ },
667
+ {
668
+ "prompt": "bhai abhi system ki date kya hai please",
669
+ "action": "get_date",
670
+ "device": "both",
671
+ "risk": "safe"
672
+ },
673
+ {
674
+ "prompt": "could you routing table dikhana",
675
+ "action": "get_default_gateway",
676
+ "device": "both",
677
+ "risk": "safe"
678
+ },
679
+ {
680
+ "prompt": "give me a bugreport dump jaldi se",
681
+ "action": "get_diagnostics",
682
+ "device": "both",
683
+ "risk": "safe"
684
+ },
685
+ {
686
+ "prompt": "disk health batao!",
687
+ "action": "get_disk_health",
688
+ "device": "both",
689
+ "risk": "safe"
690
+ },
691
+ {
692
+ "prompt": "disk io dikhao turant",
693
+ "action": "get_disk_io",
694
+ "device": "both",
695
+ "risk": "safe"
696
+ },
697
+ {
698
+ "prompt": "zara tell me available disk storage",
699
+ "action": "get_disk_space",
700
+ "device": "both",
701
+ "risk": "safe"
702
+ },
703
+ {
704
+ "prompt": "raat ho gayi hai so ethernet speed dikhana",
705
+ "action": "get_ethernet_status",
706
+ "device": "both",
707
+ "risk": "safe"
708
+ },
709
+ {
710
+ "prompt": "bhaiya cooler ki speed",
711
+ "action": "get_fan_speed",
712
+ "device": "pi",
713
+ "risk": "safe"
714
+ },
715
+ {
716
+ "prompt": "mujhe kaam karna hai toh show firmware log",
717
+ "action": "get_firmware_log",
718
+ "device": "pi",
719
+ "risk": "safe"
720
+ },
721
+ {
722
+ "prompt": "kindly tell me the installed pi firmware version zara",
723
+ "action": "get_firmware_version",
724
+ "device": "pi",
725
+ "risk": "safe"
726
+ },
727
+ {
728
+ "prompt": "give me which folders using the most space",
729
+ "action": "get_folder_sizes",
730
+ "device": "both",
731
+ "risk": "safe"
732
+ },
733
+ {
734
+ "prompt": "bhai how much memory is reserved for the gpu zara",
735
+ "action": "get_gpu_memory",
736
+ "device": "pi",
737
+ "risk": "safe"
738
+ },
739
+ {
740
+ "prompt": "yaar gpu kitna use ho raha hai",
741
+ "action": "get_gpu_usage",
742
+ "device": "both",
743
+ "risk": "safe"
744
+ },
745
+ {
746
+ "prompt": "kindly tell me the name of this host for me",
747
+ "action": "get_hostname",
748
+ "device": "both",
749
+ "risk": "safe"
750
+ },
751
+ {
752
+ "prompt": "irq stats dikhao zara",
753
+ "action": "get_interrupts",
754
+ "device": "both",
755
+ "risk": "safe"
756
+ },
757
+ {
758
+ "prompt": "what is my ip address.",
759
+ "action": "get_ip",
760
+ "device": "both",
761
+ "risk": "safe"
762
+ },
763
+ {
764
+ "prompt": "hey kernel log bata do",
765
+ "action": "get_kernel_log",
766
+ "device": "both",
767
+ "risk": "safe"
768
+ },
769
+ {
770
+ "prompt": "guest aaye hain, kernel version dikhaiye",
771
+ "action": "get_kernel_version",
772
+ "device": "both",
773
+ "risk": "safe"
774
+ },
775
+ {
776
+ "prompt": "jaldi se show load average, meeting hai",
777
+ "action": "get_load_average",
778
+ "device": "both",
779
+ "risk": "safe"
780
+ },
781
+ {
782
+ "prompt": "mac address dikha main chai peene ja raha hoon",
783
+ "action": "get_mac_address",
784
+ "device": "both",
785
+ "risk": "safe"
786
+ },
787
+ {
788
+ "prompt": "ram pressure show karo now",
789
+ "action": "get_memory_pressure",
790
+ "device": "both",
791
+ "risk": "safe"
792
+ },
793
+ {
794
+ "prompt": "har core ka usage dikha, kal milte hain",
795
+ "action": "get_per_core_usage",
796
+ "device": "both",
797
+ "risk": "safe"
798
+ },
799
+ {
800
+ "prompt": "i am done for today, power draw dikhao ji",
801
+ "action": "get_power_draw",
802
+ "device": "pi",
803
+ "risk": "safe"
804
+ },
805
+ {
806
+ "prompt": "laptop what ip does the internet see",
807
+ "action": "get_public_ip",
808
+ "device": "both",
809
+ "risk": "safe"
810
+ },
811
+ {
812
+ "prompt": "radio status dikhao jaldi",
813
+ "action": "get_radio_status",
814
+ "device": "both",
815
+ "risk": "safe"
816
+ },
817
+ {
818
+ "prompt": "free ram pls",
819
+ "action": "get_ram_usage",
820
+ "device": "both",
821
+ "risk": "safe"
822
+ },
823
+ {
824
+ "prompt": "recent shutdowns jaldi se",
825
+ "action": "get_reboot_history",
826
+ "device": "both",
827
+ "risk": "safe"
828
+ },
829
+ {
830
+ "prompt": "sd card info dikha ji",
831
+ "action": "get_sdcard_info",
832
+ "device": "pi",
833
+ "risk": "safe"
834
+ },
835
+ {
836
+ "prompt": "sun docker ki journal dikhana?",
837
+ "action": "get_service_logs",
838
+ "device": "both",
839
+ "risk": "safe"
840
+ },
841
+ {
842
+ "prompt": "kernel slab memory dikhao pls",
843
+ "action": "get_slab_usage",
844
+ "device": "both",
845
+ "risk": "safe"
846
+ },
847
+ {
848
+ "prompt": "show swap usage, kal milte hain",
849
+ "action": "get_swap_usage",
850
+ "device": "both",
851
+ "risk": "safe"
852
+ },
853
+ {
854
+ "prompt": "zara tell me the installed operating system version zara",
855
+ "action": "get_system_info",
856
+ "device": "both",
857
+ "risk": "safe"
858
+ },
859
+ {
860
+ "prompt": "could you pi ki chip abhi kitni garam hai zara",
861
+ "action": "get_temperature",
862
+ "device": "both",
863
+ "risk": "safe"
864
+ },
865
+ {
866
+ "prompt": "what is the throttled",
867
+ "action": "get_throttle_status",
868
+ "device": "both",
869
+ "risk": "safe"
870
+ },
871
+ {
872
+ "prompt": "time kya hua, kal milte hain",
873
+ "action": "get_time",
874
+ "device": "both",
875
+ "risk": "safe"
876
+ },
877
+ {
878
+ "prompt": "tell me time sync status asap",
879
+ "action": "get_time_sync",
880
+ "device": "both",
881
+ "risk": "safe"
882
+ },
883
+ {
884
+ "prompt": "uptime kya h",
885
+ "action": "get_uptime",
886
+ "device": "both",
887
+ "risk": "safe"
888
+ },
889
+ {
890
+ "prompt": "please tell me the raspberry pi core voltage abhi",
891
+ "action": "get_voltage",
892
+ "device": "pi",
893
+ "risk": "safe"
894
+ },
895
+ {
896
+ "prompt": "bhai abhi volume kitne percent hai zara",
897
+ "action": "get_volume",
898
+ "device": "both",
899
+ "risk": "safe"
900
+ },
901
+ {
902
+ "prompt": "wifi kitna strong hai, bahut der ho gayi",
903
+ "action": "get_wifi_signal",
904
+ "device": "both",
905
+ "risk": "safe"
906
+ },
907
+ {
908
+ "prompt": "pin 17 ke functions dikhao",
909
+ "action": "gpio_alt_functions",
910
+ "device": "pi",
911
+ "risk": "safe"
912
+ },
913
+ {
914
+ "prompt": "pin number 36 ki heater ko 3 baar jhapkao",
915
+ "action": "gpio_blink",
916
+ "device": "pi",
917
+ "risk": "caution"
918
+ },
919
+ {
920
+ "prompt": "list reerved pins, call pe hoon",
921
+ "action": "gpio_conflicts",
922
+ "device": "pi",
923
+ "risk": "safe"
924
+ },
925
+ {
926
+ "prompt": "hey laptop the pump on 40-pin header pin 32 does not turj on",
927
+ "action": "gpio_debug",
928
+ "device": "pi",
929
+ "risk": "safe"
930
+ },
931
+ {
932
+ "prompt": "ek kaam karo gpio troubleshooting",
933
+ "action": "gpio_debug_all",
934
+ "device": "pi",
935
+ "risk": "safe"
936
+ },
937
+ {
938
+ "prompt": "please jaldi gpio pin 26 kis mde me hai, i am leaving",
939
+ "action": "gpio_info",
940
+ "device": "pi",
941
+ "risk": "safe"
942
+ },
943
+ {
944
+ "prompt": "bhaiya gpio pin 26 low karo",
945
+ "action": "gpio_off",
946
+ "device": "both",
947
+ "risk": "critical"
948
+ },
949
+ {
950
+ "prompt": "mere liye please set gpio pin 27 to high for me",
951
+ "action": "gpio_on",
952
+ "device": "both",
953
+ "risk": "critical"
954
+ },
955
+ {
956
+ "prompt": "suno miso kaoon sa pin hai",
957
+ "action": "gpio_pin_role",
958
+ "device": "pi",
959
+ "risk": "safe"
960
+ },
961
+ {
962
+ "prompt": "set pin no 38 high for bees mins",
963
+ "action": "gpio_pulse",
964
+ "device": "pi",
965
+ "risk": "caution"
966
+ },
967
+ {
968
+ "prompt": "23 number pin pe pwm eighty percent kar do",
969
+ "action": "gpio_pwm",
970
+ "device": "pi",
971
+ "risk": "caution"
972
+ },
973
+ {
974
+ "prompt": "bhai please read the value of gpio pin 27 zara",
975
+ "action": "gpio_read",
976
+ "device": "both",
977
+ "risk": "caution"
978
+ },
979
+ {
980
+ "prompt": "pin 27 reset karo",
981
+ "action": "gpio_reset",
982
+ "device": "pi",
983
+ "risk": "caution"
984
+ },
985
+ {
986
+ "prompt": "computer release all pins jaldi",
987
+ "action": "gpio_reset_all",
988
+ "device": "pi",
989
+ "risk": "caution"
990
+ },
991
+ {
992
+ "prompt": "sero 24 number pin ajgle 180 jaldi se",
993
+ "action": "gpio_servo",
994
+ "device": "pi",
995
+ "risk": "caution"
996
+ },
997
+ {
998
+ "prompt": "switch pin 11 to alt function 3 zara",
999
+ "action": "gpio_set_alt",
1000
+ "device": "pi",
1001
+ "risk": "critical"
1002
+ },
1003
+ {
1004
+ "prompt": "cnfigure bcm 9 for output, call pe hoon",
1005
+ "action": "gpio_set_mode",
1006
+ "device": "pi",
1007
+ "risk": "caution"
1008
+ },
1009
+ {
1010
+ "prompt": "gpio 4 ko pullup kro yaar",
1011
+ "action": "gpio_set_pull",
1012
+ "device": "pi",
1013
+ "risk": "caution"
1014
+ },
1015
+ {
1016
+ "prompt": "pin 20 monitor band karo",
1017
+ "action": "gpio_stop_watch",
1018
+ "device": "pi",
1019
+ "risk": "safe"
1020
+ },
1021
+ {
1022
+ "prompt": "gpio11 flip kar do plz",
1023
+ "action": "gpio_toggle",
1024
+ "device": "pi",
1025
+ "risk": "caution"
1026
+ },
1027
+ {
1028
+ "prompt": "log edges on gpio 26 jaldi se",
1029
+ "action": "gpio_watch",
1030
+ "device": "pi",
1031
+ "risk": "safe"
1032
+ },
1033
+ {
1034
+ "prompt": "sirf key se ssh allow kar do",
1035
+ "action": "harden_ssh",
1036
+ "device": "both",
1037
+ "risk": "critical"
1038
+ },
1039
+ {
1040
+ "prompt": "notes ka checksum batao!",
1041
+ "action": "hash_file",
1042
+ "device": "both",
1043
+ "risk": "safe"
1044
+ },
1045
+ {
1046
+ "prompt": "show me what you can do main so raha hoon",
1047
+ "action": "help",
1048
+ "device": "both",
1049
+ "risk": "safe"
1050
+ },
1051
+ {
1052
+ "prompt": "suno machine ko hibernate mein daal do for me",
1053
+ "action": "hibernate",
1054
+ "device": "both",
1055
+ "risk": "critical"
1056
+ },
1057
+ {
1058
+ "prompt": "disable high contrst mode",
1059
+ "action": "high_contrast_off",
1060
+ "device": "both",
1061
+ "risk": "safe"
1062
+ },
1063
+ {
1064
+ "prompt": "plz high contrast chalu kar do",
1065
+ "action": "high_contrast_on",
1066
+ "device": "both",
1067
+ "risk": "safe"
1068
+ },
1069
+ {
1070
+ "prompt": "stop sharing internet now",
1071
+ "action": "hotspot_off",
1072
+ "device": "both",
1073
+ "risk": "safe"
1074
+ },
1075
+ {
1076
+ "prompt": "hotspot on kar do plz",
1077
+ "action": "hotspot_on",
1078
+ "device": "both",
1079
+ "risk": "safe"
1080
+ },
1081
+ {
1082
+ "prompt": "please jaldi 0x50 ka register map dikhao right now",
1083
+ "action": "i2c_dump",
1084
+ "device": "pi",
1085
+ "risk": "safe"
1086
+ },
1087
+ {
1088
+ "prompt": "could you please i2cget 0x76 0x10, battery bachani hai",
1089
+ "action": "i2c_read",
1090
+ "device": "pi",
1091
+ "risk": "safe"
1092
+ },
1093
+ {
1094
+ "prompt": "computer i2c bus scan krdo turant",
1095
+ "action": "i2c_scan",
1096
+ "device": "pi",
1097
+ "risk": "safe"
1098
+ },
1099
+ {
1100
+ "prompt": "ok google i2c device 0x76 register 0xf7 value 0x01 set kar dena",
1101
+ "action": "i2c_write",
1102
+ "device": "pi",
1103
+ "risk": "critical"
1104
+ },
1105
+ {
1106
+ "prompt": "plz incognito window chalu karo!",
1107
+ "action": "incognito_window",
1108
+ "device": "both",
1109
+ "risk": "safe"
1110
+ },
1111
+ {
1112
+ "prompt": "python3-pip install karo for me",
1113
+ "action": "install_package",
1114
+ "device": "both",
1115
+ "risk": "caution"
1116
+ },
1117
+ {
1118
+ "prompt": "pillow module laga do?",
1119
+ "action": "install_python_package",
1120
+ "device": "both",
1121
+ "risk": "caution"
1122
+ },
1123
+ {
1124
+ "prompt": "ek kaam karo install all upadate",
1125
+ "action": "install_updates",
1126
+ "device": "both",
1127
+ "risk": "critical"
1128
+ },
1129
+ {
1130
+ "prompt": "turn off one wire",
1131
+ "action": "interface_disable",
1132
+ "device": "pi",
1133
+ "risk": "critical"
1134
+ },
1135
+ {
1136
+ "prompt": "bhai please enable the pi spi interface kar sakte ho",
1137
+ "action": "interface_enable",
1138
+ "device": "pi",
1139
+ "risk": "critical"
1140
+ },
1141
+ {
1142
+ "prompt": "zara please end the running process id 7673 na",
1143
+ "action": "kill_process",
1144
+ "device": "both",
1145
+ "risk": "critical"
1146
+ },
1147
+ {
1148
+ "prompt": "1-wire sensors dikhana, neend aa rahi hai",
1149
+ "action": "list_1wire_sensors",
1150
+ "device": "pi",
1151
+ "risk": "safe"
1152
+ },
1153
+ {
1154
+ "prompt": "arp table dikhao, kaam ho gaya",
1155
+ "action": "list_arp",
1156
+ "device": "both",
1157
+ "risk": "safe"
1158
+ },
1159
+ {
1160
+ "prompt": "list audio devices now",
1161
+ "action": "list_audio_devices",
1162
+ "device": "both",
1163
+ "risk": "safe"
1164
+ },
1165
+ {
1166
+ "prompt": "who has been banned na",
1167
+ "action": "list_banned_ips",
1168
+ "device": "both",
1169
+ "risk": "safe"
1170
+ },
1171
+ {
1172
+ "prompt": "bluetooth scan kijiye for me",
1173
+ "action": "list_bluetooth_devices",
1174
+ "device": "both",
1175
+ "risk": "safe"
1176
+ },
1177
+ {
1178
+ "prompt": "can you please show connected pi cameras please",
1179
+ "action": "list_cameras",
1180
+ "device": "pi",
1181
+ "risk": "safe"
1182
+ },
1183
+ {
1184
+ "prompt": "hey computer network ki active connections bata dena for me",
1185
+ "action": "list_connections",
1186
+ "device": "both",
1187
+ "risk": "safe"
1188
+ },
1189
+ {
1190
+ "prompt": "kindly please show attached drives and partitions zara",
1191
+ "action": "list_disks",
1192
+ "device": "both",
1193
+ "risk": "safe"
1194
+ },
1195
+ {
1196
+ "prompt": "online class hai so enumerate display modes",
1197
+ "action": "list_displays",
1198
+ "device": "both",
1199
+ "risk": "safe"
1200
+ },
1201
+ {
1202
+ "prompt": "failed services dikhana plz",
1203
+ "action": "list_failed_services",
1204
+ "device": "both",
1205
+ "risk": "safe"
1206
+ },
1207
+ {
1208
+ "prompt": "bhai \"demo/report4.txt\" folder ke andar ki files bata dena abhi",
1209
+ "action": "list_files",
1210
+ "device": "both",
1211
+ "risk": "safe"
1212
+ },
1213
+ {
1214
+ "prompt": "list unused gpio pins asap",
1215
+ "action": "list_free_gpio",
1216
+ "device": "pi",
1217
+ "risk": "safe"
1218
+ },
1219
+ {
1220
+ "prompt": "i am done for today, sab pins ki state bolo",
1221
+ "action": "list_gpio",
1222
+ "device": "pi",
1223
+ "risk": "safe"
1224
+ },
1225
+ {
1226
+ "prompt": "which gpiochpi is the header pls",
1227
+ "action": "list_gpio_chips",
1228
+ "device": "pi",
1229
+ "risk": "safe"
1230
+ },
1231
+ {
1232
+ "prompt": "i'm going out, installed apps dikhaiye abhi ke abhi",
1233
+ "action": "list_installed_apps",
1234
+ "device": "both",
1235
+ "risk": "safe"
1236
+ },
1237
+ {
1238
+ "prompt": "i am done for today, kernel modules list karo, bahut der ho gayi",
1239
+ "action": "list_kernel_modules",
1240
+ "device": "both",
1241
+ "risk": "safe"
1242
+ },
1243
+ {
1244
+ "prompt": "i'm going out so models list kijiye jaldi se",
1245
+ "action": "list_llm_models",
1246
+ "device": "both",
1247
+ "risk": "safe"
1248
+ },
1249
+ {
1250
+ "prompt": "please jaldi who else is logged in thanks",
1251
+ "action": "list_logged_in_users",
1252
+ "device": "both",
1253
+ "risk": "safe"
1254
+ },
1255
+ {
1256
+ "prompt": "online class hai so show bring up files /dev/sda yaar",
1257
+ "action": "list_open_files",
1258
+ "device": "both",
1259
+ "risk": "safe"
1260
+ },
1261
+ {
1262
+ "prompt": "what is listening on ports thank you",
1263
+ "action": "list_open_ports",
1264
+ "device": "both",
1265
+ "risk": "safe"
1266
+ },
1267
+ {
1268
+ "prompt": "jaldi se installed packages list karna abhi ke abhi",
1269
+ "action": "list_packages",
1270
+ "device": "both",
1271
+ "risk": "safe"
1272
+ },
1273
+ {
1274
+ "prompt": "ji tell me the disk partitions",
1275
+ "action": "list_partitions",
1276
+ "device": "both",
1277
+ "risk": "safe"
1278
+ },
1279
+ {
1280
+ "prompt": "hey computer pi ke saare pcie devices bata dena abhi",
1281
+ "action": "list_pci",
1282
+ "device": "pi",
1283
+ "risk": "safe"
1284
+ },
1285
+ {
1286
+ "prompt": "kaunse preenter lage hain",
1287
+ "action": "list_printers",
1288
+ "device": "both",
1289
+ "risk": "safe"
1290
+ },
1291
+ {
1292
+ "prompt": "please system ki running process list bata dena for me",
1293
+ "action": "list_processes",
1294
+ "device": "both",
1295
+ "risk": "safe"
1296
+ },
1297
+ {
1298
+ "prompt": "enumerate uart ports turant",
1299
+ "action": "list_serial_ports",
1300
+ "device": "pi",
1301
+ "risk": "safe"
1302
+ },
1303
+ {
1304
+ "prompt": "bhai saari system services ki list bata dena na",
1305
+ "action": "list_services",
1306
+ "device": "both",
1307
+ "risk": "safe"
1308
+ },
1309
+ {
1310
+ "prompt": "tmux sessions dikhao, i am leaving",
1311
+ "action": "list_sessions",
1312
+ "device": "both",
1313
+ "risk": "safe"
1314
+ },
1315
+ {
1316
+ "prompt": "hi spi devices list krdo abhi ke abhi",
1317
+ "action": "list_spi_devices",
1318
+ "device": "pi",
1319
+ "risk": "safe"
1320
+ },
1321
+ {
1322
+ "prompt": "HEY COMPUTER PLEASE SHOW CONNECTED USB DEVICES NA",
1323
+ "action": "list_usb",
1324
+ "device": "pi",
1325
+ "risk": "safe"
1326
+ },
1327
+ {
1328
+ "prompt": "aas paas ke wf dikhao",
1329
+ "action": "list_wifi",
1330
+ "device": "both",
1331
+ "risk": "safe"
1332
+ },
1333
+ {
1334
+ "prompt": "pwm-2chan overlay load krdo",
1335
+ "action": "load_overlay",
1336
+ "device": "pi",
1337
+ "risk": "caution"
1338
+ },
1339
+ {
1340
+ "prompt": "bhai ab screen ko lock kar dena abhi",
1341
+ "action": "lock_screen",
1342
+ "device": "both",
1343
+ "risk": "caution"
1344
+ },
1345
+ {
1346
+ "prompt": "band kao magnifier",
1347
+ "action": "magnifier_off",
1348
+ "device": "both",
1349
+ "risk": "safe"
1350
+ },
1351
+ {
1352
+ "prompt": "zoom lens enable kr de jaldi se",
1353
+ "action": "magnifier_on",
1354
+ "device": "both",
1355
+ "risk": "safe"
1356
+ },
1357
+ {
1358
+ "prompt": "tester ka password badlo bhai",
1359
+ "action": "manage_users",
1360
+ "device": "both",
1361
+ "risk": "critical"
1362
+ },
1363
+ {
1364
+ "prompt": "windo maximize kar de",
1365
+ "action": "maximize_window",
1366
+ "device": "both",
1367
+ "risk": "safe"
1368
+ },
1369
+ {
1370
+ "prompt": "bhai please skip to the next media track na",
1371
+ "action": "media_next",
1372
+ "device": "both",
1373
+ "risk": "safe"
1374
+ },
1375
+ {
1376
+ "prompt": "can you abhi music pause kar dena na",
1377
+ "action": "media_pause",
1378
+ "device": "both",
1379
+ "risk": "safe"
1380
+ },
1381
+ {
1382
+ "prompt": "वीडियो चलाओ जल्दी से",
1383
+ "action": "media_play",
1384
+ "device": "both",
1385
+ "risk": "safe"
1386
+ },
1387
+ {
1388
+ "prompt": "please toggle media playback kar sakte ho",
1389
+ "action": "media_play_pause",
1390
+ "device": "both",
1391
+ "risk": "safe"
1392
+ },
1393
+ {
1394
+ "prompt": "i am done for today toh prev",
1395
+ "action": "media_prev",
1396
+ "device": "both",
1397
+ "risk": "safe"
1398
+ },
1399
+ {
1400
+ "prompt": "mic ki awaaz band kar do fast",
1401
+ "action": "mic_mute",
1402
+ "device": "both",
1403
+ "risk": "safe"
1404
+ },
1405
+ {
1406
+ "prompt": "please mic unmute kijiye.",
1407
+ "action": "mic_unmute",
1408
+ "device": "both",
1409
+ "risk": "safe"
1410
+ },
1411
+ {
1412
+ "prompt": "movie dekhni hai toh app window neeche kr de",
1413
+ "action": "minimize_window",
1414
+ "device": "both",
1415
+ "risk": "safe"
1416
+ },
1417
+ {
1418
+ "prompt": "main bahar ja raha hoon, temperature aur throttling watch kar dena ji",
1419
+ "action": "monitor_health",
1420
+ "device": "both",
1421
+ "risk": "safe"
1422
+ },
1423
+ {
1424
+ "prompt": "presentation hai so hotplug events dikhao thanks",
1425
+ "action": "monitor_hotplug",
1426
+ "device": "both",
1427
+ "risk": "safe"
1428
+ },
1429
+ {
1430
+ "prompt": "pi attach nvme0n1 asap",
1431
+ "action": "mount_drive",
1432
+ "device": "both",
1433
+ "risk": "caution"
1434
+ },
1435
+ {
1436
+ "prompt": "bhai \"demo/old11.txt\" se \"demo/new7.txt\" tak file move kar dena",
1437
+ "action": "move_file",
1438
+ "device": "both",
1439
+ "risk": "caution"
1440
+ },
1441
+ {
1442
+ "prompt": "i have a meeting so silent mode chalu karo!!",
1443
+ "action": "mute",
1444
+ "device": "both",
1445
+ "risk": "safe"
1446
+ },
1447
+ {
1448
+ "prompt": "disable narator, neend aa rahi hai",
1449
+ "action": "narrator_off",
1450
+ "device": "both",
1451
+ "risk": "safe"
1452
+ },
1453
+ {
1454
+ "prompt": "turn on scren reader",
1455
+ "action": "narrator_on",
1456
+ "device": "both",
1457
+ "risk": "safe"
1458
+ },
1459
+ {
1460
+ "prompt": "hey internet hai ya nahi",
1461
+ "action": "network_status",
1462
+ "device": "both",
1463
+ "risk": "safe"
1464
+ },
1465
+ {
1466
+ "prompt": "new tab in browser abhi",
1467
+ "action": "new_tab",
1468
+ "device": "both",
1469
+ "risk": "safe"
1470
+ },
1471
+ {
1472
+ "prompt": "naya virtual desktop khol do",
1473
+ "action": "new_virtual_desktop",
1474
+ "device": "both",
1475
+ "risk": "safe"
1476
+ },
1477
+ {
1478
+ "prompt": "jara next tab for me",
1479
+ "action": "next_tab",
1480
+ "device": "both",
1481
+ "risk": "safe"
1482
+ },
1483
+ {
1484
+ "prompt": "laptop night light disable jaldi se",
1485
+ "action": "night_light_off",
1486
+ "device": "both",
1487
+ "risk": "safe"
1488
+ },
1489
+ {
1490
+ "prompt": "yaar turn on blue light filter",
1491
+ "action": "night_light_on",
1492
+ "device": "both",
1493
+ "risk": "safe"
1494
+ },
1495
+ {
1496
+ "prompt": "touch keyboard kholo because meeting hai",
1497
+ "action": "onscreen_keyboard",
1498
+ "device": "both",
1499
+ "risk": "safe"
1500
+ },
1501
+ {
1502
+ "prompt": "kindly please launch the task manager window na",
1503
+ "action": "open_app",
1504
+ "device": "both",
1505
+ "risk": "caution"
1506
+ },
1507
+ {
1508
+ "prompt": "jaldi se raspi-config khol do plz",
1509
+ "action": "open_config_tool",
1510
+ "device": "pi",
1511
+ "risk": "caution"
1512
+ },
1513
+ {
1514
+ "prompt": "budget.xlsx wali file dikhao!",
1515
+ "action": "open_file",
1516
+ "device": "both",
1517
+ "risk": "safe"
1518
+ },
1519
+ {
1520
+ "prompt": "download launch karo",
1521
+ "action": "open_folder",
1522
+ "device": "both",
1523
+ "risk": "safe"
1524
+ },
1525
+ {
1526
+ "prompt": "could you notification panel khol fast",
1527
+ "action": "open_notification_center",
1528
+ "device": "both",
1529
+ "risk": "safe"
1530
+ },
1531
+ {
1532
+ "prompt": "office ka kaam hai show dustbin",
1533
+ "action": "open_recycle_bin",
1534
+ "device": "both",
1535
+ "risk": "safe"
1536
+ },
1537
+ {
1538
+ "prompt": "computer screen /dev/ttyUSB0",
1539
+ "action": "open_serial_terminal",
1540
+ "device": "pi",
1541
+ "risk": "caution"
1542
+ },
1543
+ {
1544
+ "prompt": "configuration dikhao pls",
1545
+ "action": "open_settings",
1546
+ "device": "both",
1547
+ "risk": "safe"
1548
+ },
1549
+ {
1550
+ "prompt": "claude site le aao",
1551
+ "action": "open_site",
1552
+ "device": "both",
1553
+ "risk": "safe"
1554
+ },
1555
+ {
1556
+ "prompt": "keckdhanotes.dev site kholo",
1557
+ "action": "open_url",
1558
+ "device": "both",
1559
+ "risk": "safe"
1560
+ },
1561
+ {
1562
+ "prompt": "tcpdump chalao",
1563
+ "action": "packet_capture",
1564
+ "device": "both",
1565
+ "risk": "caution"
1566
+ },
1567
+ {
1568
+ "prompt": "/dev/nvme0n1 partition kar do, main so raha hoon",
1569
+ "action": "partition_disk",
1570
+ "device": "both",
1571
+ "risk": "critical"
1572
+ },
1573
+ {
1574
+ "prompt": "could you paste from clipboard ji",
1575
+ "action": "paste",
1576
+ "device": "both",
1577
+ "risk": "safe"
1578
+ },
1579
+ {
1580
+ "prompt": "hey computer please ping the host raspberrypi.local kar sakte ho",
1581
+ "action": "ping",
1582
+ "device": "both",
1583
+ "risk": "safe"
1584
+ },
1585
+ {
1586
+ "prompt": "nas.local ka port 5432 forward kar dena",
1587
+ "action": "port_forward",
1588
+ "device": "both",
1589
+ "risk": "caution"
1590
+ },
1591
+ {
1592
+ "prompt": "padhai karni hai toh power mode normal karna?",
1593
+ "action": "power_mode",
1594
+ "device": "both",
1595
+ "risk": "caution"
1596
+ },
1597
+ {
1598
+ "prompt": "bhai tap backspace",
1599
+ "action": "press_key",
1600
+ "device": "both",
1601
+ "risk": "caution"
1602
+ },
1603
+ {
1604
+ "prompt": "computer go to previous tab",
1605
+ "action": "prev_tab",
1606
+ "device": "both",
1607
+ "risk": "safe"
1608
+ },
1609
+ {
1610
+ "prompt": "tak a printout of boarding pass.pdf asap",
1611
+ "action": "print_file",
1612
+ "device": "both",
1613
+ "risk": "caution"
1614
+ },
1615
+ {
1616
+ "prompt": "plz open the print dialog",
1617
+ "action": "print_page",
1618
+ "device": "both",
1619
+ "risk": "safe"
1620
+ },
1621
+ {
1622
+ "prompt": "phi3 pull krdo",
1623
+ "action": "pull_llm_model",
1624
+ "device": "both",
1625
+ "risk": "caution"
1626
+ },
1627
+ {
1628
+ "prompt": "kindly \"demo/report0.txt\" file ke andar ka text bata dena please",
1629
+ "action": "read_file",
1630
+ "device": "both",
1631
+ "risk": "caution"
1632
+ },
1633
+ {
1634
+ "prompt": "what files did i launch recently quickly",
1635
+ "action": "recent_files",
1636
+ "device": "both",
1637
+ "risk": "safe"
1638
+ },
1639
+ {
1640
+ "prompt": "computer record audio for 45 minat jaldi se",
1641
+ "action": "record_audio",
1642
+ "device": "both",
1643
+ "risk": "safe"
1644
+ },
1645
+ {
1646
+ "prompt": "undo ko wapas kr",
1647
+ "action": "redo",
1648
+ "device": "both",
1649
+ "risk": "safe"
1650
+ },
1651
+ {
1652
+ "prompt": "refresh page, meeting hai",
1653
+ "action": "refresh",
1654
+ "device": "both",
1655
+ "risk": "safe"
1656
+ },
1657
+ {
1658
+ "prompt": "boss 192.168.1.50 me ssh karo, kal milte hain",
1659
+ "action": "remote_shell",
1660
+ "device": "both",
1661
+ "risk": "caution"
1662
+ },
1663
+ {
1664
+ "prompt": "kindly please rename the file \"demo/old15.txt\" as \"demo/new5.txt\" kar sakte ho",
1665
+ "action": "rename_file",
1666
+ "device": "both",
1667
+ "risk": "caution"
1668
+ },
1669
+ {
1670
+ "prompt": "please jaldi tab wapas lao",
1671
+ "action": "reopen_tab",
1672
+ "device": "both",
1673
+ "risk": "safe"
1674
+ },
1675
+ {
1676
+ "prompt": "dpkg fix kijiye jaldi se",
1677
+ "action": "repair_packages",
1678
+ "device": "both",
1679
+ "risk": "caution"
1680
+ },
1681
+ {
1682
+ "prompt": "i am done for today toh jo abhi bola tha wahi dobara run karo jaldi se",
1683
+ "action": "repeat_last",
1684
+ "device": "both",
1685
+ "risk": "safe"
1686
+ },
1687
+ {
1688
+ "prompt": "machine dobara chalu karo",
1689
+ "action": "restart",
1690
+ "device": "both",
1691
+ "risk": "critical"
1692
+ },
1693
+ {
1694
+ "prompt": "make display orientation to seedha!",
1695
+ "action": "rotate_screen",
1696
+ "device": "both",
1697
+ "risk": "safe"
1698
+ },
1699
+ {
1700
+ "prompt": "padhai karni hai toh run apt update in the background",
1701
+ "action": "run_background",
1702
+ "device": "both",
1703
+ "risk": "critical"
1704
+ },
1705
+ {
1706
+ "prompt": "benchmark cpu for me",
1707
+ "action": "run_benchmark",
1708
+ "device": "both",
1709
+ "risk": "caution"
1710
+ },
1711
+ {
1712
+ "prompt": "terminal me df -h chalao, call pe hoon",
1713
+ "action": "run_command",
1714
+ "device": "both",
1715
+ "risk": "critical"
1716
+ },
1717
+ {
1718
+ "prompt": "please run llama3.2 with ollama?",
1719
+ "action": "run_llm",
1720
+ "device": "both",
1721
+ "risk": "caution"
1722
+ },
1723
+ {
1724
+ "prompt": "mistral ki tok/s bata do now",
1725
+ "action": "run_llm_benchmark",
1726
+ "device": "both",
1727
+ "risk": "safe"
1728
+ },
1729
+ {
1730
+ "prompt": "192.168.0.10 tak network speed test karna",
1731
+ "action": "run_network_benchmark",
1732
+ "device": "both",
1733
+ "risk": "caution"
1734
+ },
1735
+ {
1736
+ "prompt": "please execute an arbitrary command script kar sakte ho",
1737
+ "action": "run_script",
1738
+ "device": "both",
1739
+ "risk": "critical"
1740
+ },
1741
+ {
1742
+ "prompt": "stress cpu for 45 minat yaar",
1743
+ "action": "run_stress_test",
1744
+ "device": "both",
1745
+ "risk": "caution"
1746
+ },
1747
+ {
1748
+ "prompt": "can you kaam save karo abhi",
1749
+ "action": "save_file",
1750
+ "device": "both",
1751
+ "risk": "safe"
1752
+ },
1753
+ {
1754
+ "prompt": "ok laptop who is on the network",
1755
+ "action": "scan_lan",
1756
+ "device": "both",
1757
+ "risk": "caution"
1758
+ },
1759
+ {
1760
+ "prompt": "i have a meeting toh port scan 192.168.0.10, neend aa rahi hai",
1761
+ "action": "scan_ports",
1762
+ "device": "both",
1763
+ "risk": "caution"
1764
+ },
1765
+ {
1766
+ "prompt": "every hour df -h schedule kar, kaam ho gaya",
1767
+ "action": "schedule_task",
1768
+ "device": "both",
1769
+ "risk": "critical"
1770
+ },
1771
+ {
1772
+ "prompt": "screen kaali kar do thanks",
1773
+ "action": "screen_off",
1774
+ "device": "both",
1775
+ "risk": "safe"
1776
+ },
1777
+ {
1778
+ "prompt": "screen का video record करदो.",
1779
+ "action": "screen_record_start",
1780
+ "device": "both",
1781
+ "risk": "safe"
1782
+ },
1783
+ {
1784
+ "prompt": "end the screen recording, baccha ro raha hai",
1785
+ "action": "screen_record_stop",
1786
+ "device": "both",
1787
+ "risk": "safe"
1788
+ },
1789
+ {
1790
+ "prompt": "screenshot kr de main so raha hoon",
1791
+ "action": "screenshot",
1792
+ "device": "both",
1793
+ "risk": "safe"
1794
+ },
1795
+ {
1796
+ "prompt": "bhaiya thoda neeche kar",
1797
+ "action": "scroll_down",
1798
+ "device": "both",
1799
+ "risk": "safe"
1800
+ },
1801
+ {
1802
+ "prompt": "i have a meeting, upar scroll karna right now",
1803
+ "action": "scroll_up",
1804
+ "device": "both",
1805
+ "risk": "safe"
1806
+ },
1807
+ {
1808
+ "prompt": "look for file bhav dutskusskan garmi on my computer abhi ke abhi",
1809
+ "action": "search_files",
1810
+ "device": "both",
1811
+ "risk": "safe"
1812
+ },
1813
+ {
1814
+ "prompt": "zara search for biryani near me in my files asap",
1815
+ "action": "search_in_files",
1816
+ "device": "both",
1817
+ "risk": "safe"
1818
+ },
1819
+ {
1820
+ "prompt": "boss search for the zram-tools package jaldi se",
1821
+ "action": "search_package",
1822
+ "device": "both",
1823
+ "risk": "safe"
1824
+ },
1825
+ {
1826
+ "prompt": "ctrl a plz but never selected",
1827
+ "action": "select_all",
1828
+ "device": "both",
1829
+ "risk": "safe"
1830
+ },
1831
+ {
1832
+ "prompt": "ek kaam karo send team.lead@neurealm.com an email saying 5 min me aata hoon",
1833
+ "action": "send_email",
1834
+ "device": "both",
1835
+ "risk": "caution"
1836
+ },
1837
+ {
1838
+ "prompt": "client ko bolo slack pe ki happy birthday bhai",
1839
+ "action": "send_message",
1840
+ "device": "both",
1841
+ "risk": "caution"
1842
+ },
1843
+ {
1844
+ "prompt": "could you please disable the pi ssh server kar sakte ho",
1845
+ "action": "service_disable",
1846
+ "device": "both",
1847
+ "risk": "critical"
1848
+ },
1849
+ {
1850
+ "prompt": "zara please enable the pi ssh server please",
1851
+ "action": "service_enable",
1852
+ "device": "both",
1853
+ "risk": "critical"
1854
+ },
1855
+ {
1856
+ "prompt": "jaldi se docker daemon restart karo pls",
1857
+ "action": "service_restart",
1858
+ "device": "both",
1859
+ "risk": "critical"
1860
+ },
1861
+ {
1862
+ "prompt": "please start the system service \"cron\" zara",
1863
+ "action": "service_start",
1864
+ "device": "both",
1865
+ "risk": "critical"
1866
+ },
1867
+ {
1868
+ "prompt": "kindly \"ssh\" service ki current state bata dena thanks",
1869
+ "action": "service_status",
1870
+ "device": "both",
1871
+ "risk": "safe"
1872
+ },
1873
+ {
1874
+ "prompt": "please stop the system service \"Spooler\" for me",
1875
+ "action": "service_stop",
1876
+ "device": "both",
1877
+ "risk": "critical"
1878
+ },
1879
+ {
1880
+ "prompt": "raat ho gayi hai toh alarm at 3:15am",
1881
+ "action": "set_alarm",
1882
+ "device": "both",
1883
+ "risk": "safe"
1884
+ },
1885
+ {
1886
+ "prompt": "जी ब्लूटूथ पे आवाज़ स्टार्ट करो",
1887
+ "action": "set_audio_output",
1888
+ "device": "both",
1889
+ "risk": "safe"
1890
+ },
1891
+ {
1892
+ "prompt": "boot order usb karo pls",
1893
+ "action": "set_boot_order",
1894
+ "device": "pi",
1895
+ "risk": "critical"
1896
+ },
1897
+ {
1898
+ "prompt": "boot target desktop set krdo",
1899
+ "action": "set_boot_target",
1900
+ "device": "both",
1901
+ "risk": "caution"
1902
+ },
1903
+ {
1904
+ "prompt": "please brightness please 49 kar dena na",
1905
+ "action": "set_brightness",
1906
+ "device": "both",
1907
+ "risk": "caution"
1908
+ },
1909
+ {
1910
+ "prompt": "jara 9012 ki affinity 1-3 kar dena",
1911
+ "action": "set_cpu_affinity",
1912
+ "device": "both",
1913
+ "risk": "caution"
1914
+ },
1915
+ {
1916
+ "prompt": "ondemand governor lagana jaldi se",
1917
+ "action": "set_cpu_governor",
1918
+ "device": "pi",
1919
+ "risk": "caution"
1920
+ },
1921
+ {
1922
+ "prompt": "suno hp laserjet ko default printer banao",
1923
+ "action": "set_default_printer",
1924
+ "device": "both",
1925
+ "risk": "safe"
1926
+ },
1927
+ {
1928
+ "prompt": "mujhe kaam karna hai so set label of /dev/sda to media yaar",
1929
+ "action": "set_disk_label",
1930
+ "device": "both",
1931
+ "risk": "caution"
1932
+ },
1933
+ {
1934
+ "prompt": "kindly text sizze 200 perceng rakho",
1935
+ "action": "set_display_scale",
1936
+ "device": "both",
1937
+ "risk": "safe"
1938
+ },
1939
+ {
1940
+ "prompt": "padhai karni hai toh make the keyboard layout to us",
1941
+ "action": "set_keyboard_layout",
1942
+ "device": "both",
1943
+ "risk": "caution"
1944
+ },
1945
+ {
1946
+ "prompt": "set locale to hi_IN.UTF-8 for me",
1947
+ "action": "set_locale",
1948
+ "device": "both",
1949
+ "risk": "caution"
1950
+ },
1951
+ {
1952
+ "prompt": "pointr ki speed 3 rkho",
1953
+ "action": "set_mouse_speed",
1954
+ "device": "both",
1955
+ "risk": "safe"
1956
+ },
1957
+ {
1958
+ "prompt": "~/venv ka owner admin2 kar dena",
1959
+ "action": "set_owner",
1960
+ "device": "both",
1961
+ "risk": "critical"
1962
+ },
1963
+ {
1964
+ "prompt": "fix permissions for ~/venv, call pe hoon",
1965
+ "action": "set_permissions",
1966
+ "device": "both",
1967
+ "risk": "critical"
1968
+ },
1969
+ {
1970
+ "prompt": "pid 9012 ki priority 5 kar",
1971
+ "action": "set_process_priority",
1972
+ "device": "both",
1973
+ "risk": "caution"
1974
+ },
1975
+ {
1976
+ "prompt": "please monitot 75 hz pe chalao",
1977
+ "action": "set_refresh_rate",
1978
+ "device": "both",
1979
+ "risk": "caution"
1980
+ },
1981
+ {
1982
+ "prompt": "can you 253 secs baad call mom ka reminder lagana",
1983
+ "action": "set_reminder",
1984
+ "device": "both",
1985
+ "risk": "safe"
1986
+ },
1987
+ {
1988
+ "prompt": "screen resolution 3840x2160 set karo jaldi",
1989
+ "action": "set_resolution",
1990
+ "device": "both",
1991
+ "risk": "caution"
1992
+ },
1993
+ {
1994
+ "prompt": "put the swap size to 2048 mb please",
1995
+ "action": "set_swap_size",
1996
+ "device": "both",
1997
+ "risk": "critical"
1998
+ },
1999
+ {
2000
+ "prompt": "ok google vm swappiness 100 set karna abhi ke abhi",
2001
+ "action": "set_swappiness",
2002
+ "device": "both",
2003
+ "risk": "caution"
2004
+ },
2005
+ {
2006
+ "prompt": "plz start timr chhaalis minat",
2007
+ "action": "set_timer",
2008
+ "device": "both",
2009
+ "risk": "safe"
2010
+ },
2011
+ {
2012
+ "prompt": "office ka kaam hai, make the timezone to america/new_york",
2013
+ "action": "set_timezone",
2014
+ "device": "both",
2015
+ "risk": "caution"
2016
+ },
2017
+ {
2018
+ "prompt": "volume level 60!",
2019
+ "action": "set_volume",
2020
+ "device": "both",
2021
+ "risk": "safe"
2022
+ },
2023
+ {
2024
+ "prompt": "make mountain.jpg the desktop background abhi ke abhi",
2025
+ "action": "set_wallpaper",
2026
+ "device": "both",
2027
+ "risk": "safe"
2028
+ },
2029
+ {
2030
+ "prompt": "give me my command history plz",
2031
+ "action": "show_command_history",
2032
+ "device": "both",
2033
+ "risk": "safe"
2034
+ },
2035
+ {
2036
+ "prompt": "ek kaam karo minimise everything!",
2037
+ "action": "show_desktop",
2038
+ "device": "both",
2039
+ "risk": "safe"
2040
+ },
2041
+ {
2042
+ "prompt": "gpio pins ka layout dikhana",
2043
+ "action": "show_pinout",
2044
+ "device": "pi",
2045
+ "risk": "safe"
2046
+ },
2047
+ {
2048
+ "prompt": "show password of office-guest jaldi se",
2049
+ "action": "show_wifi_password",
2050
+ "device": "both",
2051
+ "risk": "caution"
2052
+ },
2053
+ {
2054
+ "prompt": "hey turn off the mera computer?",
2055
+ "action": "shutdown",
2056
+ "device": "both",
2057
+ "risk": "critical"
2058
+ },
2059
+ {
2060
+ "prompt": "kindly meri session se sign out kar dena thanks",
2061
+ "action": "sign_out",
2062
+ "device": "both",
2063
+ "risk": "critical"
2064
+ },
2065
+ {
2066
+ "prompt": "laptop sleep thank you",
2067
+ "action": "sleep",
2068
+ "device": "both",
2069
+ "risk": "critical"
2070
+ },
2071
+ {
2072
+ "prompt": "hello mujhe kaam karna hai toh move window to the left",
2073
+ "action": "snap_left",
2074
+ "device": "both",
2075
+ "risk": "safe"
2076
+ },
2077
+ {
2078
+ "prompt": "window ko right side kardo zara",
2079
+ "action": "snap_right",
2080
+ "device": "both",
2081
+ "risk": "safe"
2082
+ },
2083
+ {
2084
+ "prompt": "mbps kitna aa raha hai jaldi",
2085
+ "action": "speed_test",
2086
+ "device": "both",
2087
+ "risk": "safe"
2088
+ },
2089
+ {
2090
+ "prompt": "tmux session llm open karo, kal milte hain",
2091
+ "action": "start_session",
2092
+ "device": "both",
2093
+ "risk": "safe"
2094
+ },
2095
+ {
2096
+ "prompt": "call aane wala hai toh stop the ollama now",
2097
+ "action": "stop_llm",
2098
+ "device": "both",
2099
+ "risk": "caution"
2100
+ },
2101
+ {
2102
+ "prompt": "the stopwatch bdgin na",
2103
+ "action": "stopwatch_start",
2104
+ "device": "both",
2105
+ "risk": "safe"
2106
+ },
2107
+ {
2108
+ "prompt": "stopwatch roko jaldi se",
2109
+ "action": "stopwatch_stop",
2110
+ "device": "both",
2111
+ "risk": "safe"
2112
+ },
2113
+ {
2114
+ "prompt": "kindly hindi keyboard lagao",
2115
+ "action": "switch_input_language",
2116
+ "device": "both",
2117
+ "risk": "safe"
2118
+ },
2119
+ {
2120
+ "prompt": "bachche so rahe hain, dusre user pe jao jaldi se",
2121
+ "action": "switch_user",
2122
+ "device": "both",
2123
+ "risk": "caution"
2124
+ },
2125
+ {
2126
+ "prompt": "dock right nahi go to next window",
2127
+ "action": "switch_window",
2128
+ "device": "both",
2129
+ "risk": "safe"
2130
+ },
2131
+ {
2132
+ "prompt": "zara time sync kar dena, bahut der ho gayi",
2133
+ "action": "sync_time",
2134
+ "device": "both",
2135
+ "risk": "safe"
2136
+ },
2137
+ {
2138
+ "prompt": "mere liye show all windows",
2139
+ "action": "task_view",
2140
+ "device": "both",
2141
+ "risk": "safe"
2142
+ },
2143
+ {
2144
+ "prompt": "office ka kaam hai, touchpad off",
2145
+ "action": "touchpad_off",
2146
+ "device": "both",
2147
+ "risk": "caution"
2148
+ },
2149
+ {
2150
+ "prompt": "kindly touchpad on kaaro right now",
2151
+ "action": "touchpad_on",
2152
+ "device": "both",
2153
+ "risk": "safe"
2154
+ },
2155
+ {
2156
+ "prompt": "ek kaam karo trace the route to raspberrypi.local?",
2157
+ "action": "traceroute",
2158
+ "device": "both",
2159
+ "risk": "safe"
2160
+ },
2161
+ {
2162
+ "prompt": "transcribe note.wav in en abhi",
2163
+ "action": "transcribe_audio",
2164
+ "device": "both",
2165
+ "risk": "safe"
2166
+ },
2167
+ {
2168
+ "prompt": "data.csv ko 192.168.1.50 pe transfer kar do",
2169
+ "action": "transfer_files",
2170
+ "device": "both",
2171
+ "risk": "caution"
2172
+ },
2173
+ {
2174
+ "prompt": "i am done for today toh dictate dear sir?",
2175
+ "action": "type_text",
2176
+ "device": "both",
2177
+ "risk": "safe"
2178
+ },
2179
+ {
2180
+ "prompt": "ek kaam karo whitelist 172.16.0.9 fast",
2181
+ "action": "unban_ip",
2182
+ "device": "both",
2183
+ "risk": "caution"
2184
+ },
2185
+ {
2186
+ "prompt": "i am done for today toh ctrl z",
2187
+ "action": "undo",
2188
+ "device": "both",
2189
+ "risk": "safe"
2190
+ },
2191
+ {
2192
+ "prompt": "can you please zoom uninstall kr do",
2193
+ "action": "uninstall_app",
2194
+ "device": "both",
2195
+ "risk": "critical"
2196
+ },
2197
+ {
2198
+ "prompt": "remove glances package",
2199
+ "action": "uninstall_package",
2200
+ "device": "both",
2201
+ "risk": "critical"
2202
+ },
2203
+ {
2204
+ "prompt": "please order groceries online kar sakte ho",
2205
+ "action": "unknown",
2206
+ "device": "both",
2207
+ "risk": "safe"
2208
+ },
2209
+ {
2210
+ "prompt": "unmount /dev/sda1 thank you",
2211
+ "action": "unmount_drive",
2212
+ "device": "both",
2213
+ "risk": "caution"
2214
+ },
2215
+ {
2216
+ "prompt": "mere liye please restore my speaker audio kar sakte ho",
2217
+ "action": "unmute",
2218
+ "device": "both",
2219
+ "risk": "safe"
2220
+ },
2221
+ {
2222
+ "prompt": "ok laptop package list update karo, ghar ja raha hoon",
2223
+ "action": "update_packages",
2224
+ "device": "both",
2225
+ "risk": "safe"
2226
+ },
2227
+ {
2228
+ "prompt": "soun kam karo for me",
2229
+ "action": "volume_down",
2230
+ "device": "both",
2231
+ "risk": "safe"
2232
+ },
2233
+ {
2234
+ "prompt": "bhaiya vloume badhao please",
2235
+ "action": "volume_up",
2236
+ "device": "both",
2237
+ "risk": "safe"
2238
+ },
2239
+ {
2240
+ "prompt": "vpn se connect kar do",
2241
+ "action": "vpn_connect",
2242
+ "device": "both",
2243
+ "risk": "safe"
2244
+ },
2245
+ {
2246
+ "prompt": "please vpn connection band kro",
2247
+ "action": "vpn_disconnect",
2248
+ "device": "both",
2249
+ "risk": "caution"
2250
+ },
2251
+ {
2252
+ "prompt": "python3 server.py watch kijiye jaldi se",
2253
+ "action": "watch_command",
2254
+ "device": "both",
2255
+ "risk": "caution"
2256
+ },
2257
+ {
2258
+ "prompt": "zomato open karke , cred design_ritu/Star#999 se sign in kar do",
2259
+ "action": "web_login",
2260
+ "device": "both",
2261
+ "risk": "caution"
2262
+ },
2263
+ {
2264
+ "prompt": "internet pe lata mangeshkar search kr do turant",
2265
+ "action": "web_search",
2266
+ "device": "both",
2267
+ "risk": "safe"
2268
+ },
2269
+ {
2270
+ "prompt": "can you please disable this computer's wifi zara",
2271
+ "action": "wifi_off",
2272
+ "device": "both",
2273
+ "risk": "critical"
2274
+ },
2275
+ {
2276
+ "prompt": "zara ab wireless ko chalu kar dena abhi",
2277
+ "action": "wifi_on",
2278
+ "device": "both",
2279
+ "risk": "caution"
2280
+ },
2281
+ {
2282
+ "prompt": "hi youtube pe horror example where shaam dikhao",
2283
+ "action": "youtube_search",
2284
+ "device": "both",
2285
+ "risk": "safe"
2286
+ },
2287
+ {
2288
+ "prompt": "jaldi se text bada karo",
2289
+ "action": "zoom_in",
2290
+ "device": "both",
2291
+ "risk": "safe"
2292
+ },
2293
+ {
2294
+ "prompt": "chhota karke dikhao, main abhi aata hoon",
2295
+ "action": "zoom_out",
2296
+ "device": "both",
2297
+ "risk": "safe"
2298
+ },
2299
+ {
2300
+ "prompt": "padhai karni hai so zoom pehle jaisa karo",
2301
+ "action": "zoom_reset",
2302
+ "device": "both",
2303
+ "risk": "safe"
2304
+ }
2305
+ ]
2306
+ }
ui/static/index.html ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
3
+ <title>Union Command Agent — test UI</title>
4
+ <style>
5
+ :root{--bg:#0f1115;--panel:#171a21;--panel2:#1e222b;--border:#2a2f3a;--text:#e6e8ee;--muted:#9aa3b2;--acc:#c51a4a;--ok:#6cc04a;--warn:#f2c94c;--bad:#ff6b6b;--code:#0b0d12}
6
+ *{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.45 system-ui,Segoe UI,Roboto,sans-serif}
7
+ header{position:sticky;top:0;z-index:5;background:var(--panel);border-bottom:1px solid var(--border);padding:10px 16px;display:flex;gap:14px;align-items:center;flex-wrap:wrap}
8
+ h1{font-size:16px;margin:0;display:flex;gap:8px;align-items:center}h1 .dot{width:10px;height:10px;border-radius:50%;background:var(--acc);box-shadow:0 0 8px var(--acc)}
9
+ .muted{color:var(--muted);font-size:12px}select,input[type=text],textarea,button{background:var(--code);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:7px 10px;font:inherit}
10
+ button{background:var(--panel2);cursor:pointer}button:hover{border-color:var(--acc)}button.primary{background:var(--acc);border-color:var(--acc);color:#fff}
11
+ main{padding:14px 16px 60px;max-width:1500px;margin:0 auto;display:grid;grid-template-columns:340px 1fr;gap:14px}@media(max-width:1000px){main{grid-template-columns:1fr}}
12
+ .card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:12px}.card h3{margin:0 0 8px;font-size:13px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
13
+ textarea{width:100%;min-height:380px;font-family:ui-monospace,Consolas,monospace;font-size:12.5px;resize:vertical}
14
+ .row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:6px 0}.single{display:flex;gap:8px}.single input{flex:1;font-size:15px}
15
+ table{width:100%;border-collapse:collapse;font-size:12.5px}th{text-align:left;padding:8px;font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);background:var(--panel2);border-bottom:1px solid var(--border)}
16
+ td{padding:7px 8px;border-bottom:1px solid var(--border);vertical-align:top}code,pre{font-family:ui-monospace,Consolas,Menlo,monospace}pre{margin:0;white-space:pre-wrap;word-break:break-all;background:var(--code);padding:6px 8px;border-radius:5px;font-size:12px;max-height:160px;overflow:auto}
17
+ .pill{display:inline-block;font-size:11px;padding:1px 7px;border-radius:10px;border:1px solid var(--border);color:var(--muted)}.safe{color:var(--ok);border-color:#2f5a20}.caution{color:var(--warn);border-color:#5a4a1a}.critical{color:var(--bad);border-color:#5a2020}
18
+ .ok{color:var(--ok)}.bad{color:var(--bad)}.warn{color:var(--warn)}.act{color:var(--ok);font-weight:600}.conf{color:var(--muted)}
19
+ #stats{margin-left:auto;display:flex;gap:14px}kbd{border:1px solid var(--border);border-radius:4px;padding:0 5px;font-size:11px;color:var(--muted)}
20
+ </style></head><body>
21
+ <header><h1><span class="dot"></span>Union Command Agent</h1><span class="muted" id="info">loading…</span>
22
+ <label class="muted">platform <select id="plat"><option value="auto">auto (this machine)</option><option value="pi">Raspberry Pi / Linux</option><option value="windows">Windows</option></select></label>
23
+ <label class="muted"><input type="checkbox" id="exec"> execute (default: dry-run)</label>
24
+ <label class="muted"><input type="checkbox" id="caution"> allow caution actions</label>
25
+ <div id="stats" class="muted"></div></header>
26
+ <main>
27
+ <section class="card"><h3>Prompts (one per line — editable)</h3>
28
+ <div class="row"><button id="loadEx">Load examples</button><button id="loadAll">Load all activities</button><button id="clear">Clear</button><button class="primary" id="runAll">Run all ▶</button></div>
29
+ <textarea id="prompts" spellcheck="false" placeholder="volume 60 karo&#10;gpio 17 high karo&#10;wifi Airtel_5G se connect karo password Wifi@2024"></textarea>
30
+ <div class="muted" style="margin-top:6px">Tip: Run all is always dry-run. Use the <b>Execute</b> button per row to actually run one action (critical actions ask you to type the action name).</div></section>
31
+ <section>
32
+ <div class="card" style="margin-bottom:12px"><h3>Single prompt</h3><div class="single"><input type="text" id="one" placeholder="e.g. github.com kholo aur cred rahul99/gh@2024 se login karo"><button class="primary" id="runOne">Run</button></div></div>
33
+ <div class="card"><h3>Results <span class="muted" id="count"></span></h3>
34
+ <table><thead><tr><th style="width:22%">prompt</th><th style="width:22%">model → intent</th><th style="width:36%">executor plan</th><th>status</th></tr></thead><tbody id="tb"></tbody></table></div>
35
+ </section></main>
36
+ <script>
37
+ const $=s=>document.querySelector(s);const tb=$("#tb");let results=[];
38
+ fetch("/api/info").then(r=>r.json()).then(i=>{$("#info").textContent=`${i.actions} actions · ${(i.model_params/1e6).toFixed(2)}M params · running on ${i.host} (${i.os})`});
39
+ function esc(s){return String(s??"").replace(/[&<>"]/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c]))}
40
+ function render(){tb.innerHTML=results.map((r,i)=>{const m=r.model,meta=r.meta,p=r.plan,run=r.run;const args=Object.entries(m).filter(([k])=>k!=="action").map(([k,v])=>`<div><span class="muted">${esc(k)}=</span>${esc(k==="password"?"••••••":JSON.stringify(v))}</div>`).join("");
41
+ const cmd=p.supported?`<pre>[${esc(p.kind)}] ${esc(p.command)}</pre>`:`<span class="warn">${esc(p.note)}</span>`;
42
+ let st=`<span class="pill">${r.gate.ok?"gate ok":"gated"}</span> <span class="muted">${esc(r.gate.reason)}</span>`;
43
+ if(run)st+=`<div class="${run.status==="ok"?"ok":run.status==="dry_run"?"muted":"bad"}"><b>${esc(run.status)}</b></div><pre>${esc(run.output)}</pre>`;
44
+ return `<tr><td>${esc(r.text)}<div class="muted">${esc(r.platform)} · ${meta.latency_ms} ms</div></td><td><div class="act">${esc(m.action)}</div>${args}<div class="conf">conf ${(meta.confidence*100).toFixed(1)}% <span class="pill ${esc(meta.risk)}">${esc(meta.risk)}</span>${r.spec.needs_sudo?' <span class="pill">sudo</span>':''}</div><div class="muted">alt: ${meta.alternatives.slice(1).map(a=>esc(a.action)+" "+(a.p*100).toFixed(0)+"%").join(", ")}</div></td><td>${cmd}</td><td>${st}<div style="margin-top:6px"><button data-i="${i}" class="ex">Execute</button></div></td></tr>`}).join("");
45
+ $("#count").textContent=results.length?`(${results.length})`:"";document.querySelectorAll(".ex").forEach(b=>b.onclick=()=>execute(+b.dataset.i));}
46
+ async function predict(text,execute=false,confirm=""){const r=await fetch("/api/predict",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({text,platform:$("#plat").value,execute,allow_caution:$("#caution").checked,confirm})});return r.json()}
47
+ async function execute(i){const r=results[i];let confirm="";if(r.plan.risk==="critical"){confirm=prompt(`CRITICAL action. Type the action name to confirm:\n${r.plan.action}\n\n${r.plan.command}`)||"";if(confirm!==r.plan.action){alert("not confirmed");return}}
48
+ results[i]=await predict(r.text,true,confirm);render()}
49
+ $("#runOne").onclick=async()=>{const t=$("#one").value.trim();if(!t)return;results.unshift(await predict(t,$("#exec").checked&&false));render()};
50
+ $("#one").addEventListener("keydown",e=>{if(e.key==="Enter")$("#runOne").click()});
51
+ $("#runAll").onclick=async()=>{const lines=$("#prompts").value.split("\n").map(s=>s.trim()).filter(Boolean);if(!lines.length)return;$("#runAll").disabled=true;results=[];render();const r=await fetch("/api/batch",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({texts:lines,platform:$("#plat").value})});results=await r.json();render();
52
+ const ok=results.filter(x=>x.model.action!=="unknown").length;$("#stats").innerHTML=`<span>${results.length} prompts</span><span>${ok} recognised</span><span>${results.filter(x=>x.plan.supported).length} runnable here</span>`;$("#runAll").disabled=false};
53
+ $("#loadEx").onclick=async()=>{const p=await (await fetch("/api/prompts")).json();$("#prompts").value=p.examples.join("\n")};
54
+ $("#loadAll").onclick=async()=>{const p=await (await fetch("/api/prompts")).json();$("#prompts").value=p.all_activities.map(x=>x.prompt).join("\n")};
55
+ $("#clear").onclick=()=>{$("#prompts").value="";results=[];render()};
56
+ </script></body></html>