Jarvis2345 commited on
Commit
243637a
·
verified ·
1 Parent(s): a31f556

deploy(S4): Blender headless pipeline + WebAR client + backend fixes

Browse files
modules/cyber_engine.py CHANGED
@@ -10,7 +10,7 @@ class CyberEngine:
10
  self.target_cache = {}
11
 
12
  def scan_network(self, subnet="192.168.1.0/24"):
13
- \"\"\"Performs a sophisticated network scan to identify active nodes.\"\"\"
14
  try:
15
  nm = nmap3.Nmap()
16
  results = nm.scan(subnet)
@@ -19,7 +19,7 @@ class CyberEngine:
19
  return f"Scan failed: {str(e)}"
20
 
21
  def lookup_osint(self, target):
22
- \"\"\"Performs Open Source Intelligence gathering on a target email or username.\"\"\"
23
  # Simulated OSINT flow for a professional tool
24
  results = {
25
  "target": target,
@@ -31,7 +31,7 @@ class CyberEngine:
31
  return results
32
 
33
  def port_scan(self, ip):
34
- \"\"\"Surgical port scan of a specific target.\"\"\"
35
  open_ports = []
36
  for port in [21, 22, 80, 443, 3389, 8080]:
37
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -42,7 +42,7 @@ class CyberEngine:
42
  return open_ports
43
 
44
  def la_blackout(self):
45
- \"\"\"Emergency system wipe/lockdown sequence.\"\"\"
46
  # This is a high-risk command
47
  return "Initiating BLACKOUT: All active sessions terminated. Memory wiped. Disconnecting from network."
48
 
 
10
  self.target_cache = {}
11
 
12
  def scan_network(self, subnet="192.168.1.0/24"):
13
+ """Performs a sophisticated network scan to identify active nodes."""
14
  try:
15
  nm = nmap3.Nmap()
16
  results = nm.scan(subnet)
 
19
  return f"Scan failed: {str(e)}"
20
 
21
  def lookup_osint(self, target):
22
+ """Performs Open Source Intelligence gathering on a target email or username."""
23
  # Simulated OSINT flow for a professional tool
24
  results = {
25
  "target": target,
 
31
  return results
32
 
33
  def port_scan(self, ip):
34
+ """Surgical port scan of a specific target."""
35
  open_ports = []
36
  for port in [21, 22, 80, 443, 3389, 8080]:
37
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
42
  return open_ports
43
 
44
  def la_blackout(self):
45
+ """Emergency system wipe/lockdown sequence."""
46
  # This is a high-risk command
47
  return "Initiating BLACKOUT: All active sessions terminated. Memory wiped. Disconnecting from network."
48
 
modules/feature_tour.py CHANGED
@@ -1,865 +1,1748 @@
1
- """
2
- modules/feature_tour.py — F.R.I.D.A.Y OMEGA Deep Feature Tour
3
- Like a game tutorial - auto-starts on first run and walks through EVERY feature.
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- import json
9
- from dataclasses import dataclass
10
- from pathlib import Path
11
- from typing import Callable
12
-
13
- ROOT = Path(__file__).resolve().parents[1]
14
- TOUR_STATE_FILE = ROOT / "data" / "tour_state.json"
15
-
16
-
17
- @dataclass(frozen=True)
18
- class TourStep:
19
- step_id: str
20
- category: str
21
- title: str
22
- voice_intro: str # What FRIDAY says
23
- voice_hint: str # What to say to continue
24
- feature_intro: str # Feature explanation HTML
25
- try_it: str # Try this command
26
- why_important: str # Why user should care
27
-
28
-
29
- # 50+ FEATURE TOUR STEPS - EVERYTHING IN FRIDAY
30
- FEATURE_TOUR = [
31
- # ═══════════════════════════════════════════════════════════════
32
- # SECTION 1: BASICS (Steps 1-5)
33
- # ═══════════════════════════════════════════════════════════════
34
- TourStep(
35
- step_id="intro",
36
- category="basics",
37
- title="Welcome to Your New AI Assistant",
38
- voice_intro="Welcome to F.R.I.D.A.Y OMEGA! I'm going to show you everything I can do. This tour takes about 15 minutes but you'll know every feature by the end.",
39
- voice_hint="let's begin",
40
- feature_intro="""<h2>F.R.I.D.A.Y OMEGA</h2>
41
- <p>I'm an AI assistant powered by Gemini 2.5 Flash. I can:</p>
42
- <ul>
43
- <li>Control your entire Windows PC</li>
44
- <li>Answer questions using AI brain</li>
45
- <li>Automate any task you describe</li>
46
- <li>Learn your preferences</li>
47
- <li>Control your phone remotely</li>
48
- </ul>
49
- <p>This tour covers <strong>all 500+ commands</strong> and <strong>151 modules</strong>.</p>""",
50
- try_it="none",
51
- why_important="This tour unlocks your full potential with me.",
52
- ),
53
-
54
- TourStep(
55
- step_id="voice_basics",
56
- category="basics",
57
- title="How Voice Commands Work",
58
- voice_intro="First, understand how we talk. I listen constantly. Just speak naturally and I'll understand.",
59
- voice_hint="okay",
60
- feature_intro="""<h3>Voice Command Basics</h3>
61
- <table>
62
- <tr><td><code>"What's the time"</code></td><td>Get current time</td></tr>
63
- <tr><td><code>"Open Notepad"</code></td><td>Launch any app</td></tr>
64
- <tr><td><code>"Volume 50"</code></td><td>Set volume 0-100</td></tr>
65
- <tr><td><code>"Search YouTube for cats"</code></td><td>Search + play</td></tr>
66
- </table>
67
-
68
- <h4>How I Understand:</h4>
69
- <ul>
70
- <li><strong>Natural language:</strong> "Make it louder" = "Volume up"</li>
71
- <li><strong>Context aware:</strong> Remembers what we discussed</li>
72
- <li><strong>Intent parsing:</strong> Understands what you mean, not just what you say</li>
73
- </ul>""",
74
- try_it="'what's the time'",
75
- why_important="90% of FRIDAY is voice - master this!",
76
- ),
77
-
78
- TourStep(
79
- step_id="hotkey",
80
- category="basics",
81
- title="The Secret Hotkey",
82
- voice_intro="There's a secret hotkey that shows my status without speaking. It's F6 then F2 then F9 pressed together.",
83
- voice_hint="got it",
84
- feature_intro="""<h3>The Hotkey Sequence: F6 + F2 + F9</h3>
85
- <div class="warning"><strong>SECURITY:</strong> This hotkey is how you interact with me BEFORE activation.</div>
86
-
87
- <h4>What It Does:</h4>
88
- <ul>
89
- <li><strong>Before激活:</strong> Shows activation prompt</li>
90
- <li><strong>After激活:</strong> Shows full status (mode, memory, CPU)</li>
91
- <li><strong>Anytime:</strong> Interrupts current operation</li>
92
- </ul>
93
-
94
- <h4>Why It Exists:</h4>
95
- <p>The hotkey bypasses voice recognition. Useful when:</p>
96
- <ul>
97
- <li>Voice isn't working</li>
98
- <li>Environment is noisy</li>
99
- <li>You need exact commands</li>
100
- </ul>""",
101
- try_it="press F6 F2 F9",
102
- why_important="Your secret weapon for reliable control.",
103
- ),
104
-
105
- TourStep(
106
- step_id="personality",
107
- category="basics",
108
- title="6 Personality Modes",
109
- voice_intro="I have 6 different personalities. Say 'personality' plus the name to switch.",
110
- voice_hint="show me",
111
- feature_intro="""<h3>Personality Modes</h3>
112
- <table>
113
- <tr><td>🎭 <strong>Stark</strong></td><td>Tony Stark - Witty, confident, helpful</td></tr>
114
- <tr><td>🎯 <strong>Tactical</strong></td><td>Direct, efficient, mission-focused</td></tr>
115
- <tr><td>😌 <strong>Chill</strong></td><td>Relaxed, casual, friendly</td></tr>
116
- <tr><td>🎮 <strong>Gaming</strong></td><td>Gamer-speak, quick responses</td></tr>
117
- <tr><td>🚀 <strong>Mission</strong></td><td>Serious, alert, action-oriented</td></tr>
118
- <tr><td>🛡️ <strong>Guardian</strong></td><td>Security-focused, protective</td></tr>
119
- </table>
120
-
121
- <h4>How To Switch:</h4>
122
- <ul>
123
- <li>Say: "Personality Stark"</li>
124
- <li>Say: "Switch to Gaming"</li>
125
- <li>Auto-switches based on context</li>
126
- </ul>""",
127
- try_it="'personality stark'",
128
- why_important="Changes how I respond to you.",
129
- ),
130
-
131
- TourStep(
132
- step_id="help",
133
- category="basics",
134
- title="Getting Help Anytime",
135
- voice_intro="If you ever forget what I can do, just ask. I'll tell you.",
136
- voice_hint="what can you do",
137
- feature_intro="""<h3>Help Commands</h3>
138
- <table>
139
- <tr><td><code>"What can you do?"</code></td><td>List all capabilities</td></tr>
140
- <tr><td><code>"Help me"</code></td><td>Interactive help</td></tr>
141
- <tr><td><code>"List commands"</code></td><td>All voice commands</td></tr>
142
- <tr><td><code>"How do I..."</code></td><td>Specific help</td></tr>
143
- </table>
144
-
145
- <h4>Context Help:</h4>
146
- <ul>
147
- <li>Say "Help with [app]" for app-specific commands</li>
148
- <li>Say "What commands for [feature]?" for features</li>
149
- <li>Say "Show my shortcuts" for quick commands</li>
150
- </ul>""",
151
- try_it="'what can you do'",
152
- why_important="Never get stuck - just ask!",
153
- ),
154
-
155
- # ═══════════════════════════════════════════════════════════════
156
- # SECTION 2: SYSTEM CONTROL (Steps 6-15)
157
- # ═══════════════════════════════════════════════════════════════
158
- TourStep(
159
- step_id="volume",
160
- category="system",
161
- title="Volume Control",
162
- voice_intro="I can control your system volume with commands. Say 'volume' plus a number.",
163
- voice_hint="test it",
164
- feature_intro="""<h3>Volume Commands</h3>
165
- <table>
166
- <tr><td><code>"Volume 50"</code></td><td>Set to 50%</td></tr>
167
- <tr><td><code>"Volume up"</code></td><td>Increase 5%</td></tr>
168
- <tr><td><code>"Volume down"</code></td><td>Decrease 5%</td></tr>
169
- <tr><td><code>"Volume 0" or "Mute"</code></td><td>Full mute</td></tr>
170
- <tr><td><code>"Max volume"</code></td><td>100% volume</td></tr>
171
- </table>
172
-
173
- <h4>Advanced:</h4>
174
- <ul>
175
- <li>Say "Percentage" for exact control</li>
176
- <li>Say "too loud/quiet" for adjustment</li>
177
- <li>Say "reset volume" to return to 50%</li>
178
- </ul>""",
179
- try_it="'volume 75'",
180
- why_important="Essential daily control!",
181
- ),
182
-
183
- TourStep(
184
- step_id="brightness",
185
- category="system",
186
- title="Display Brightness",
187
- voice_intro="I can adjust your screen brightness too. Works on most laptops.",
188
- voice_hint="bright",
189
- feature_intro="""<h3>Brightness Commands</h3>
190
- <table>
191
- <tr><td><code>"Brightness 50"</code></td><td>Set to 50%</td></tr>
192
- <tr><td><code>"Increase brightness"</code></td><td>Brighter</td></tr>
193
- <tr><td><code>"Decrease brightness"</code></td><td>Dimmer</td></tr>
194
- <tr><td><code>"Dim it"</code></td><td>Minimum brightness</td></tr>
195
- </table>
196
-
197
- <h4>Related Features:</h4>
198
- <ul>
199
- <li><code>"Night light on"</code> - Warm colors for night</li>
200
- <li><code>"HDR on/off"</code> - HDR toggle</li>
201
- <li><code>"Cycle brightness"</code> - Rotate presets</li>
202
- </ul>""",
203
- try_it="'brightness 50'",
204
- why_important="Protect your eyes!",
205
- ),
206
-
207
- TourStep(
208
- step_id="wifi",
209
- category="system",
210
- title="Wi-Fi & Bluetooth",
211
- voice_intro="Wi-Fi and Bluetooth controls - say 'Wi-Fi on' or 'Bluetooth off'.",
212
- voice_hint="control",
213
- feature_intro="""<h3>Network Controls</h3>
214
- <table>
215
- <tr><td><code>"Wi-Fi on/off"</code></td><td>Toggle Wi-Fi</td></tr>
216
- <tr><td><code>"Bluetooth on/off"</code></td><td>Toggle Bluetooth</td></tr>
217
- <tr><td><code>"Airplane mode on/off"</code></td><td>Fight mode</td></tr>
218
- <tr><td><code>"Show networks"</code></td><td>List Wi-Fi networks</td></tr>
219
- </table>
220
-
221
- <h4>Quick Connect:</h4>
222
- <ul>
223
- <li>Say "Connect to [network name]"</li>
224
- <li>Say "Forget [network]" to remove</li>
225
- <li>Say "What's my IP?" to see address</li>
226
- </ul>""",
227
- try_it="'wi-fi on'",
228
- why_important="Instant network control!",
229
- ),
230
-
231
- TourStep(
232
- step_id="apps",
233
- category="system",
234
- title="App Control",
235
- voice_intro="I can open and close any application. Say 'Open [app name]'.",
236
- voice_hint="ready",
237
- feature_intro="""<h3>App Control</h3>
238
- <table>
239
- <tr><td><code>"Open Chrome"</code></td><td>Launch browser</td></tr>
240
- <tr><td><code>"Open Spotify"</code></td><td>Launch music</td></tr>
241
- <tr><td><code>"Open Discord"</code></td><td>Launch chat</td></tr>
242
- <tr><td><code>"Close Chrome"</code></td><td>Close app</td></tr>
243
- <tr><td><code>"Restart [app]"</code></td><td>Force restart</td></tr>
244
- </table>
245
-
246
- <h4>Universal:</h4>
247
- <p>Say "Open [anything]" - I can launch ANY installed app!</p>""",
248
- try_it="'open notepad'",
249
- why_important="Single voice command for ANY app!",
250
- ),
251
-
252
- TourStep(
253
- step_id="window",
254
- category="system",
255
- title="Window Management",
256
- voice_intro="Move and resize windows with voice. Like 'maximize window' or 'snap left'.",
257
- voice_hint="move it",
258
- feature_intro="""<h3>Window Commands</h3>
259
- <table>
260
- <tr><td><code>"Maximize window"</code></td><td>Full screen</td></tr>
261
- <tr><td><code>"Minimize window"</code></td><td>To taskbar</td></tr>
262
- <tr><td><code>"Snap left/right"</code></td><td>Half screen</td></tr>
263
- <tr><td><code>"Center window"</code></td><td>Middle screen</td></tr>
264
- <tr><td><code>"Tile windows"</code></td><td>Arrange all</td></tr>
265
- </table>
266
-
267
- <h4>Virtual Desktops:</h4>
268
- <ul>
269
- <li>Say "New desktop" - Create workspace</li>
270
- <li>Say "Switch desktop" - Move between</li>
271
- <li>Say "Close desktop" - Delete workspace</li>
272
- </ul>""",
273
- try_it="'maximize window'",
274
- why_important="Mouse-free window control!",
275
- ),
276
-
277
- TourStep(
278
- step_id="power",
279
- category="system",
280
- title="Power Management",
281
- voice_intro="Shutdown, restart, sleep - all with voice commands.",
282
- voice_hint="power",
283
- feature_intro="""<h3>Power Commands</h3>
284
- <table>
285
- <tr><td><code>"Lock PC"</code></td><td>Lock screen</td></tr>
286
- <tr><td><code>"Sleep"</code></td><td>Sleep mode</td></tr>
287
- <tr><td><code>"Restart"</code></td><td>Reboot</td></tr>
288
- <tr><td><code>"Shut down"</code></td><td>Power off</td></tr>
289
- <tr><td><code>"Sign out"</code></td><td>Log off</td></tr>
290
- </table>
291
-
292
- <h4>Timer:</h4>
293
- <ul>
294
- <li>Say "Shut down in 30 minutes"</li>
295
- <li>Say "Restart at 6 PM"</li>
296
- <li>Say "Cancel shutdown" to abort</li>
297
- </ul>""",
298
- try_it="'lock pc'",
299
- why_important="Complete power control!",
300
- ),
301
-
302
- TourStep(
303
- step_id="screenshot",
304
- category="system",
305
- title="Screenshots & Recording",
306
- voice_intro="Capture your screen with voice. Say 'take a screenshot'.",
307
- voice_hint="capture",
308
- feature_intro="""<h3>Screenshot Commands</h3>
309
- <table>
310
- <tr><td><code>"Take a screenshot"</code></td><td>Capture screen</td></tr>
311
- <tr><td><code>"Record screen"</code></td><td>Start recording</td></tr>
312
- <tr><td><code>"Stop recording"</code></td><td>End recording</td></tr>
313
- <tr><td><code>"Copy screen"</code></td><td>To clipboard</td></tr>
314
- </table>
315
-
316
- <h4>Region Capture:</h4>
317
- <ul>
318
- <li>Say "Capture [app] window"</li>
319
- <li>Say "Screenshot in 5 seconds"</li>
320
- <li>Files save to Pictures/FRIDAY</li>
321
- </ul>""",
322
- try_it="'take a screenshot'",
323
- why_important="Instant capture without buttons!",
324
- ),
325
-
326
- TourStep(
327
- step_id="clipboard",
328
- category="system",
329
- title="Clipboard Intelligence",
330
- voice_intro="I remember your clipboard and can smart-paste. Say 'paste' for intelligent paste.",
331
- voice_hint="clipboard",
332
- feature_intro="""<h3>Clipboard Commands</h3>
333
- <table>
334
- <tr><td><code>"What's in clipboard"</code></td><td>Show contents</td></tr>
335
- <tr><td><code>"Clear clipboard"</code></td><td>Empty clipboard</td></tr>
336
- <tr><td><code>"Copy that"</code></td><td>Re-copy last item</td></tr>
337
- <tr><td><code>"Clipboard history"</code></td><td>Show last 10</td></tr>
338
- </table>
339
-
340
- <h4>Smart Features:</h4>
341
- <ul>
342
- <li>Auto-remembers copied items</li>
343
- <li>Intelligent paste (formats data)</li>
344
- <li>Phone clipboard sync (optional)</li>
345
- </ul>""",
346
- try_it="'clipboard history'",
347
- why_important="Your digital memory!",
348
- ),
349
-
350
- TourStep(
351
- step_id="files",
352
- category="system",
353
- title="File Operations",
354
- voice_intro="Find, open, organize files with voice. Say 'find [file name]'.",
355
- voice_hint="files",
356
- feature_intro="""<h3>File Commands</h3>
357
- <table>
358
- <tr><td><code>"Find [filename]"</code></td><td>Search files</td></tr>
359
- <tr><td><code>"Open [path]"</code></td><td>Open file</td></tr>
360
- <tr><td><code>"New folder [name]"</code></td><td>Create folder</td></tr>
361
- <tr><td><code>"Show downloads"</code></td><td>Open downloads</td></tr>
362
- </table>
363
-
364
- <h4>Recent Files:</h4>
365
- <ul>
366
- <li>Say "Recent files" for history</li>
367
- <li>Say "Organize desktop" to tidy</li>
368
- <li>Say "File details [name]" for info</li>
369
- </ul>""",
370
- try_it="'find document'",
371
- why_important="Find anything instantly!",
372
- ),
373
-
374
- # ═══════════════════════════════════════════════════════════════
375
- # SECTION 3: VOICE & AUDIO (Steps 16-20)
376
- # ═══════════════════════════════════════════════════════════════
377
- TourStep(
378
- step_id="music",
379
- category="audio",
380
- title="Music Control",
381
- voice_intro="Control Spotify and any music player. 'Play', 'pause', 'next song'.",
382
- voice_hint="music",
383
- feature_intro="""<h3>Music Commands</h3>
384
- <table>
385
- <tr><td><code>"Play music"</code></td><td>Start Spotify</td></tr>
386
- <tr><td><code>"Play"</code></td><td>Resume</td></tr>
387
- <tr><td><code>"Pause"</code></td><td>Pause</td></tr>
388
- <tr><td><code>"Next song"</code></td><td>Skip</td></tr>
389
- <tr><td><code>"Previous song"</code></td><td>Go back</td></tr>
390
- </table>
391
-
392
- <h4>Search & Play:</h4>
393
- <ul>
394
- <li>Say "Search YouTube for [song]"</li>
395
- <li>Say "Play [artist]"</li>
396
- <li>Say "Play my liked songs"</li>
397
- </ul>""",
398
- try_it="'play music'",
399
- why_important="Full voice music control!",
400
- ),
401
-
402
- TourStep(
403
- step_id="voice_modes",
404
- category="audio",
405
- title="Voice Modes",
406
- voice_intro="I have speaking modes. 'Whisper mode' for quiet responses, 'broadcast mode' for loud.",
407
- voice_hint="whisper",
408
- feature_intro="""<h3>Voice Modes</h3>
409
- <table>
410
- <tr><td><code>"Whisper mode"</code></td><td>Quiet responses</td></tr>
411
- <tr><td><code>"Normal mode"</code></td><td>Default volume</td></tr>
412
- <tr><td><code>"Broadcast"</code></td><td>Loud announcements</td></tr>
413
- <tr><td><code>"Silent mode"</code></td><td>Text-only responses</td></tr>
414
- </table>
415
-
416
- <h4>Quick Toggles:</h4>
417
- <ul>
418
- <li>Say "Don't talk loud"</li>
419
- <li>Say "Be quiet"</li>
420
- <li>Say "Use short responses"</li>
421
- </ul>""",
422
- try_it="'whisper mode'",
423
- why_important="Perfect for different situations!",
424
- ),
425
-
426
- # ═══════════════════════════════════════════════════════════════
427
- # SECTION 4: REMINDERS & TASKS (Steps 21-28)
428
- # ═══════════════════════════════════════════════════════════════
429
- TourStep(
430
- step_id="reminders",
431
- category="tasks",
432
- title="Reminders",
433
- voice_intro="Set reminders with natural speech. Say 'remind me to [task] in [time]'.",
434
- voice_hint="set one",
435
- feature_intro="""<h3>Reminder Commands</h3>
436
- <table>
437
- <tr><td><code>"Remind me to [task]"</code></td><td>Set in 30 min</td></tr>
438
- <tr><td><code>"Remind me at [time]"</code></td><td>Specific time</td></tr>
439
- <tr><td><code>"What's my schedule"</code></td><td>Show all</td></tr>
440
- <tr><td><code>"Clear reminders"</code></td><td>Remove all</td></tr>
441
- </table>
442
-
443
- <h4>Natural Time:</h4>
444
- <ul>
445
- <li>"in 5 minutes"</li>
446
- <li>"at 3 PM"</li>
447
- <li>"tomorrow morning"</li>
448
- <li>"next Monday"</li>
449
- </ul>""",
450
- try_it="'remind me to drink water in 30 minutes'",
451
- why_important="Never forget anything!",
452
- ),
453
-
454
- TourStep(
455
- step_id="routines",
456
- category="tasks",
457
- title="Routines & Habits",
458
- voice_intro="Create routines for repeated tasks. Say 'create routine [name]' or 'new routine'.",
459
- voice_hint="routines",
460
- feature_intro="""<h3>Routine Commands</h3>
461
- <table>
462
- <tr><td><code>"Create routine [name]"</code></td><td>Start creation</td></tr>
463
- <tr><td><code>"Run routine [name]"</code></td><td>Execute</td></tr>
464
- <tr><td><code>"List routines"</code></td><td>Show all</td></tr>
465
- <tr><td><code>"Edit routine [name]"</code></td><td>Modify</td></tr>
466
- </table>
467
-
468
- <h4>Example:</h4>
469
- <p>"Create morning routine" add actions done!</p>""",
470
- try_it="'create routine morning'",
471
- why_important="Automate your daily tasks!",
472
- ),
473
-
474
- TourStep(
475
- step_id="calendar",
476
- category="tasks",
477
- title="Calendar & Events",
478
- voice_intro="Add events to calendar. Say 'add to calendar [event]'.",
479
- voice_hint="calendar",
480
- feature_intro="""<h3>Calendar Commands</h3>
481
- <table>
482
- <tr><td><code>"Add to calendar [event]"</code></td><td>Add event</td></tr>
483
- <tr><td><code>"What's on [day]?"</code></td><td>Show events</td></tr>
484
- <tr><td><code>"My schedule"</code></td><td>Today</td></tr>
485
- <tr><td><code>"Remove [event]"</code></td><td>Delete</td></tr>
486
- </table>
487
-
488
- <h4>Natural Input:</h4>
489
- <ul>
490
- <li>"Meeting tomorrow at 3"</li>
491
- <li>"Lunch with John Friday"</li>
492
- <li>"Call mom Saturday 10am"</li>
493
- </ul>""",
494
- try_it="'add to calendar team meeting tomorrow at 3 pm'",
495
- why_important="Voice calendar!",
496
- ),
497
-
498
- TourStep(
499
- step_id="habits",
500
- category="tasks",
501
- title="Habit Tracking",
502
- voice_intro="Track habits you want to build. Say 'track [habit]' or 'log [habit]'.",
503
- voice_hint="habits",
504
- feature_intro="""<h3>Habit Tracking</h3>
505
- <table>
506
- <tr><td><code>"Track [habit]"</code></td><td>Start tracking</td></tr>
507
- <tr><td><code>"Log [habit]"</code></td><td>Mark done</td></tr>
508
- <tr><td><code>"My habits"</code></td><td>Show status</td></tr>
509
- <tr><td><code>"Habit stats"</code></td><td>Statistics</td></tr>
510
- </table>
511
-
512
- <h4>Examples:</h4>
513
- <ul>
514
- <li>"Track drinking water"</li>
515
- <li>"Log meditation"</li>
516
- <li>"Track reading"</li>
517
- </ul>""",
518
- try_it="'log reading'",
519
- why_important="Build better habits!",
520
- ),
521
-
522
- # ═══════════════════════════════════════════════════════════════
523
- # SECTION 5: AI BRAIN (Steps 29-35)
524
- # ═══════════════════════════════════════════════════════════════
525
- TourStep(
526
- step_id="ai_executor",
527
- category="ai",
528
- title="AI Task Executor",
529
- voice_intro="Here's the magic - I can do ANY task you describe using AI. Just say 'execute [task]'.",
530
- voice_hint="execute",
531
- feature_intro="""<h3>AI Executor</h3>
532
- <p>Unlike fixed commands, I use AI to understand and execute ANY task:</p>
533
-
534
- <table>
535
- <tr><td><code>"Research [topic]"</code></td><td>Find info online</td></tr>
536
- <tr><td><code>"Analyze [file]"</code></td><td>AI document analysis</td></tr>
537
- <tr><td><code>"Write [something]"</code></td><td>Generate content</td></tr>
538
- <tr><td><code>"Calculate [math]"</code></td><td>Do math</td></tr>
539
- </table>
540
-
541
- <h4>Chain Commands:</h4>
542
- <p>Say "Do X and Y then Z" for multi-step tasks!</p>""",
543
- try_it="'research quantum computing'",
544
- why_important="UNLIMITED Tasks - I can do ANYTHING!",
545
- ),
546
-
547
- TourStep(
548
- step_id="memory",
549
- category="ai",
550
- title="Memory System",
551
- voice_intro="I remember our conversations. Say 'remember that' or 'what did I say about'.",
552
- voice_hint="memory",
553
- feature_intro="""<h3>Memory Commands</h3>
554
- <table>
555
- <tr><td><code>"Remember that [info]"</code></td><td>Save information</td></tr>
556
- <tr><td><code>"What did I tell you about [topic]?"</code></td><td>Recall</td></tr>
557
- <tr><td><code>"Forget [topic]"</code></td><td>Remove</td></tr>
558
- <tr><td><code>"My memories"</code></td><td>List all</td></tr>
559
- </table>
560
-
561
- <h4>Auto-Memory:</h4>
562
- <ul>
563
- <li>I remember important things automaticall</li>
564
- <li>Context carries across sessions</li>
565
- <li>Deep memory for long-term</li>
566
- </ul>""",
567
- try_it="'remember that i prefer dark mode'",
568
- why_important="I never forget!",
569
- ),
570
-
571
- TourStep(
572
- step_id="mood",
573
- category="ai",
574
- title="Mood Detection",
575
- voice_intro="I detect your mood and adjust responses. I can tell if you're happy, stressed, or tired.",
576
- voice_hint="mood",
577
- feature_intro="""<h3>Mood Detection</h3>
578
- <p>I analyze your voice and behavior to detect mood:</p>
579
-
580
- <table>
581
- <tr><td>😄 <strong>Happy</strong></td><td>Cheerful responses</td></tr>
582
- <tr><td>😐 <strong>Neutral</strong></td><td>Standard responses</td></tr>
583
- <tr><td>😔 <strong>Sad</strong></td><td>Sympathetic responses</td></tr>
584
- <tr><td>😤 <strong>Frustrated</strong></td><td>Helpful, patient</td></tr>
585
- </table>
586
-
587
- <h4>Manual Override:</h4>
588
- <ul>
589
- <li>Say "I'm feeling [mood]"</li>
590
- <li>Say "Be more [personality]"</li>
591
- </ul>""",
592
- try_it="how do i feel",
593
- why_important="I adapt to you!",
594
- ),
595
-
596
- # ═══════════════════════════════════════════════════════════════════════
597
- # SECTION 6: SECURITY (Steps 36-42)
598
- # ═══════════════════════════════════════════════════════════════
599
- TourStep(
600
- step_id="emergency",
601
- category="security",
602
- title="Emergency Mode",
603
- voice_intro="Say 'emergency mode' for red alert. Activates all security protocols.",
604
- voice_hint="emergency",
605
- feature_intro="""<h3>Emergency Mode</h3>
606
- <div class="warning"><strong>RED ALERT - ALL SYSTEMS HIGH</strong></div>
607
-
608
- <table>
609
- <tr><td><code>"Emergency mode"</code></td><td>Activate red alert</td></tr>
610
- <tr><td><code>"Disable emergency"</code></td><td>Deactivate</td></tr>
611
- <tr><td><code>"Security status"</code></td><td>Check security</td></tr>
612
- </table>
613
-
614
- <h4>What Happens:</h4>
615
- <ul>
616
- <li>Enhanced monitoring</li>
617
- <li>Full logging</li>
618
- <li>Strict authentication</li>
619
- <li>Alert notifications</li>
620
- </ul>""",
621
- try_it="'emergency mode'",
622
- why_important="Maximum security when needed!",
623
- ),
624
-
625
- TourStep(
626
- step_id="firewall",
627
- category="security",
628
- title="Firewall Control",
629
- voice_intro="Voice-controlled Windows firewall. Say 'check firewall'.",
630
- voice_hint="firewall",
631
- feature_intro="""<h3>Firewall Commands</h3>
632
- <table>
633
- <tr><td><code>"Check firewall"</code></td><td>Show status</td></tr>
634
- <tr><td><code>"Enable firewall"</code></td><td>Turn on</td></tr>
635
- <tr><td><code>"Disable firewall"</code></td><td>Turn off</td></tr>
636
- <tr><td><code>"Firewall status"</code></td><td>Detailed view</td></tr>
637
- </table>
638
-
639
- <div class="warning"><strong>Note:</strong> May need admin for changes.</div>""",
640
- try_it="'check firewall'",
641
- why_important="Voice firewall control!",
642
- ),
643
-
644
- # ═══════════════════════════════════════════════════════════════
645
- # SECTION 7: INFO & WEATHER (Steps 43-48)
646
- # ═══════════════════════════════════════════════════════════════
647
- TourStep(
648
- step_id="weather",
649
- category="info",
650
- title="Weather",
651
- voice_intro="Get weather info instantly. Say 'what's the weather' or 'will it rain'.",
652
- voice_hint="weather",
653
- feature_intro="""<h3>Weather Commands</h3>
654
- <table>
655
- <tr><td><code>"What's the weather"</code></td><td>Current</td></tr>
656
- <tr><td><code>"Weather forecast"</code></td><td>3-day</td></tr>
657
- <tr><td><code>"Will it rain"</code></td><td>Rain check</td></tr>
658
- <tr><td><code>"Temperature"</code></td><td>Current temp</td></tr>
659
- </table>
660
-
661
- <h4>Extended:</h4>
662
- <ul>
663
- <li>"Weather for [city]"- Remote check</li>
664
- <li>"Weekend weather"- Plan ahead</li>
665
- <li>"Best time for [activity]"- Recommendation</li>
666
- </ul>""",
667
- try_it="'what's the weather'",
668
- why_important="Always be prepared!",
669
- ),
670
-
671
- TourStep(
672
- step_id="health",
673
- category="info",
674
- title="System Health",
675
- voice_intro="Monitor your PC's health. Say 'health report' or 'system status'.",
676
- voice_hint="health",
677
- feature_intro="""<h3>Health Commands</h3>
678
- <table>
679
- <tr><td><code>"Health report"</code></td><td>Full diagnostics</td></tr>
680
- <tr><td><code>"System status"</code></td><td>Quick overview</td></tr>
681
- <tr><td><code>"RAM usage"</code></td><td>Memory check</td></tr>
682
- <tr><td><code>"CPU temperature"</code></td><td>Temp check</td></tr>
683
- </table>
684
-
685
- <h4>Monitoring:</h4>
686
- <ul>
687
- <li>I track CPU, RAM, disk</li>
688
- <li>Temperature trends</li>
689
- <li>Performance alerts</li>
690
- </ul>""",
691
- try_it="'health report'",
692
- why_important="Know your PC's status!",
693
- ),
694
-
695
- # ═══════════════════════════════════════════════════════════════
696
- # SECTION 8: PHONE & AR (Steps 49-55)
697
- # ═══════════════════════════════════════════════════════════════
698
- TourStep(
699
- step_id="phone",
700
- category="phone",
701
- title="Phone Control",
702
- voice_intro="Control your PC from your phone using Tailscale VPN. Optional but powerful.",
703
- voice_hint="phone",
704
- feature_intro="""<h3>Phone Control</h3>
705
- <p>Control FRIDAY from your Android phone:</p>
706
-
707
- <table>
708
- <tr><td>📱 <strong>APK</strong></td><td>FridayLink app</td></tr>
709
- <tr><td>🌐 <strong>Tailscale</strong></td><td>VPN connection</td></tr>
710
- <tr><td>🎤 <strong>Voice</strong></td><td>Speak commands</td></tr>
711
- <tr><td>🖥️ <strong>Screen</strong></td><td>View PC</td></tr>
712
- </table>
713
-
714
- <h4>Setup:</h4>
715
- <ol>
716
- <li>Install APK from phone/android/</li>
717
- <li>Install Tailscale on both</li>
718
- <li>Connect via Tailscale IP</li>
719
- </ol>""",
720
- try_it="phone connected",
721
- why_important="Control PC from anywhere!",
722
- ),
723
-
724
- TourStep(
725
- step_id=\"ar\",`n category=\"ar\",`n title=\"Omni-AR System\",`n voice_intro=\"Behold the Omni-AR System! Industrial-grade holograms with real-time scene patching. Say 'enable AR' to launch the HUD.\",
726
- voice_hint="ar",
727
- feature_intro=\"\"\"<h3>Omni-AR Mode</h3>`n<p>Real-time holographic projections synced across PC and Phone.</p>`n<table>`n<tr><td><code>\"Enable AR\"</code></td><td>Initialize HUD</td></tr>`n<tr><td><code>\"AR preset table\"</code></td><td>Holographic Workspace</td></tr>`n<tr><td><code>\"AR preset helmet\"</code></td><td>Face-Tracked HUD</td></tr>`n</table>`n<h4 class=\"text-primary\">New Capabilities:</h4>`n<ul>`n<li>Low-Latency State Sync (8ms)</li>`n<li>Dynamic Scene Patching</li>`n<li>ArUco Marker Tracking</li>`n</ul>\"\"\"
728
-
729
- <h4>Presets:</h4>
730
- <ul>
731
- <li><strong>Table:</strong> ArUco marker holograms</li>
732
- <li><strong>Helmet:</strong> Face-tracked HUD</li>
733
- <li><strong>Float:</strong> Floating holograms</li>
734
- </ul>""",
735
- try_it="'enable ar'",
736
- why_important="Tony Stark vibes! 🤖",
737
- ),
738
-
739
- # ═══════════════════════════════════════════════════════════════
740
- # SECTION 9: FINAL (Steps 56-60)
741
- # ═══════════════════════════════════════════════════════════════
742
- TourStep(
743
- step_id=\"ai_brain\",`n category=\"ai\",`n title=\"Jarvis Intelligence\",`n voice_intro=\"Finally, meet the heart of the system: Jarvis Intelligence. I don't just answer questions�I understand your objectives and predict your needs.\",
744
- voice_hint="ask me",
745
- feature_intro=\"\"\"<h3>Jarvis Intelligence - The Cognitive Core</h3>
746
- <p>Powered by Gemini 2.5 Flash:</p>
747
-
748
- <table>
749
- <tr><td>💭 <strong>Questions</strong></td><td>Ask anything</td></tr>
750
- <tr><td>🔬 <strong>Research</strong></td><td>Deep dive</td></tr>
751
- <tr><td>✍️ <strong>Writing</strong></td><td>Generate content</td></tr>
752
- <tr><td>🧮 <strong>Math</strong></td><td>Solve problems</td></tr>
753
- </table>
754
-
755
- <h4>Examples:</h4>
756
- <ul>
757
- <li>"Explain quantum computing"</li>
758
- <li>"Write a poem about AI"</li>
759
- <li>"How do I learn Python?"</li>
760
- </ul>""",
761
- try_it="'explain machine learning in simple terms'",
762
- why_important="UNLIMITED knowledge!",
763
- ),
764
-
765
- TourStep(
766
- step_id="completion",
767
- category="final",
768
- title="Tour Complete!",
769
- voice_intro="Congratulations! You've learned every major feature. I'm ready to assist you.",
770
- voice_hint="thank you",
771
- feature_intro="""<h1>🎉 TOUR COMPLETE!</h1>
772
-
773
- <p>You now know all of FRIDAY's major features:</p>
774
-
775
- <h3>Summary:</h3>
776
- <ul>
777
- <li> Voice Commands (500+)</li>
778
- <li>✅ System Control</li>
779
- <li>✅ AI Executor</li>
780
- <li>✅ Memory</li>
781
- <li>✅ Reminders & Routines</li>
782
- <li>✅ Security</li>
783
- <li> Phone Control</li>
784
- <li>✅ AR Mode</li>
785
- </ul>
786
-
787
- <h3>Quick Reference:</h3>
788
- <ul>
789
- <li><code>"Help"</code> - Get help</li>
790
- <li><code>"What can you do"</code> - List features</li>
791
- <li><code>"Check setup"</code> - Setup status</li>
792
- </ul>
793
-
794
- <div class="note"><strong>Tip:</strong> I learn your preferences over time. The more you use me, the better I assist you!</div>""",
795
- try_it="finish tour",
796
- why_important="You're a FRIDAY pro now!",
797
- ),
798
- ]
799
-
800
-
801
- def start_tour() -> TourStep:
802
- """Start the feature tour."""
803
- state = {"step": 0, "started": True, "total": len(FEATURE_TOUR)}
804
- save_tour_state(state)
805
- return FEATURE_TOUR[0]
806
-
807
-
808
- def advance_tour() -> TourStep | None:
809
- """Advance to next step."""
810
- state = load_tour_state()
811
- idx = state.get("step", 0)
812
- if idx + 1 >= len(FEATURE_TOUR):
813
- return None
814
- state["step"] = idx + 1
815
- save_tour_state(state)
816
- return FEATURE_TOUR[idx + 1]
817
-
818
-
819
- def load_tour_state() -> dict:
820
- if TOUR_STATE_FILE.exists():
821
- try:
822
- return json.loads(TOUR_STATE_FILE.read_text(encoding="utf-8"))
823
- except Exception:
824
- pass
825
- return {"step": 0, "started": False}
826
-
827
-
828
- def save_tour_state(state: dict) -> None:
829
- TOUR_STATE_FILE.parent.mkdir(parents=True, exist_ok=True)
830
- TOUR_STATE_FILE.write_text(json.dumps(state, indent=2), encoding="utf-8")
831
-
832
-
833
- def get_current_tour_step() -> TourStep | None:
834
- state = load_tour_state()
835
- idx = state.get("step", 0)
836
- if idx >= len(FEATURE_TOUR):
837
- return None
838
- return FEATURE_TOUR[idx]
839
-
840
-
841
- def process_tour_command(cmd: str) -> tuple[bool, TourStep | None]:
842
- """Process tour voice command."""
843
- cmd = (cmd or "").lower().strip()
844
- current = get_current_tour_step()
845
- if not current:
846
- return False, None
847
-
848
- # Check completion hints
849
- hints = ["next", "continue", "let's begin", "got it", "test it", "ok", "okay", "thank you", "finish", "done"]
850
- if any(h in cmd for h in hints):
851
- step = advance_tour()
852
- return True, step
853
-
854
- return False, current
855
-
856
-
857
- def get_tour_progress() -> dict:
858
- state = load_tour_state()
859
- total = len(FEATURE_TOUR)
860
- return {
861
- "current": state.get("step", 0),
862
- "total": total,
863
- "percent": int((state.get("step", 0) / total) * 100),
864
- "step_id": FEATURE_TOUR[state.get("step", 0)].step_id if state.get("step", 0) < total else "complete",
865
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+
3
+ modules/feature_tour.py F.R.I.D.A.Y OMEGA Deep Feature Tour
4
+
5
+ Like a game tutorial - auto-starts on first run and walks through EVERY feature.
6
+
7
+ """
8
+
9
+
10
+
11
+ from __future__ import annotations
12
+
13
+
14
+
15
+ import json
16
+
17
+ from dataclasses import dataclass
18
+
19
+ from pathlib import Path
20
+
21
+ from typing import Callable
22
+
23
+
24
+
25
+ ROOT = Path(__file__).resolve().parents[1]
26
+
27
+ TOUR_STATE_FILE = ROOT / "data" / "tour_state.json"
28
+
29
+
30
+
31
+
32
+
33
+ @dataclass(frozen=True)
34
+
35
+ class TourStep:
36
+
37
+ step_id: str
38
+
39
+ category: str
40
+
41
+ title: str
42
+
43
+ voice_intro: str # What FRIDAY says
44
+
45
+ voice_hint: str # What to say to continue
46
+
47
+ feature_intro: str # Feature explanation HTML
48
+
49
+ try_it: str # Try this command
50
+
51
+ why_important: str # Why user should care
52
+
53
+
54
+
55
+
56
+
57
+ # 50+ FEATURE TOUR STEPS - EVERYTHING IN FRIDAY
58
+
59
+ FEATURE_TOUR = [
60
+
61
+ # ═══════════════════════════════════════════════════════════════
62
+
63
+ # SECTION 1: BASICS (Steps 1-5)
64
+
65
+ # ═══════════════════════════════════════════════════════════════
66
+
67
+ TourStep(
68
+
69
+ step_id="intro",
70
+
71
+ category="basics",
72
+
73
+ title="Welcome to Your New AI Assistant",
74
+
75
+ voice_intro="Welcome to F.R.I.D.A.Y OMEGA! I'm going to show you everything I can do. This tour takes about 15 minutes but you'll know every feature by the end.",
76
+
77
+ voice_hint="let's begin",
78
+
79
+ feature_intro="""<h2>F.R.I.D.A.Y OMEGA</h2>
80
+
81
+ <p>I'm an AI assistant powered by Gemini 2.5 Flash. I can:</p>
82
+
83
+ <ul>
84
+
85
+ <li>Control your entire Windows PC</li>
86
+
87
+ <li>Answer questions using AI brain</li>
88
+
89
+ <li>Automate any task you describe</li>
90
+
91
+ <li>Learn your preferences</li>
92
+
93
+ <li>Control your phone remotely</li>
94
+
95
+ </ul>
96
+
97
+ <p>This tour covers <strong>all 500+ commands</strong> and <strong>151 modules</strong>.</p>""",
98
+
99
+ try_it="none",
100
+
101
+ why_important="This tour unlocks your full potential with me.",
102
+
103
+ ),
104
+
105
+
106
+
107
+ TourStep(
108
+
109
+ step_id="voice_basics",
110
+
111
+ category="basics",
112
+
113
+ title="How Voice Commands Work",
114
+
115
+ voice_intro="First, understand how we talk. I listen constantly. Just speak naturally and I'll understand.",
116
+
117
+ voice_hint="okay",
118
+
119
+ feature_intro="""<h3>Voice Command Basics</h3>
120
+
121
+ <table>
122
+
123
+ <tr><td><code>"What's the time"</code></td><td>Get current time</td></tr>
124
+
125
+ <tr><td><code>"Open Notepad"</code></td><td>Launch any app</td></tr>
126
+
127
+ <tr><td><code>"Volume 50"</code></td><td>Set volume 0-100</td></tr>
128
+
129
+ <tr><td><code>"Search YouTube for cats"</code></td><td>Search + play</td></tr>
130
+
131
+ </table>
132
+
133
+
134
+
135
+ <h4>How I Understand:</h4>
136
+
137
+ <ul>
138
+
139
+ <li><strong>Natural language:</strong> "Make it louder" = "Volume up"</li>
140
+
141
+ <li><strong>Context aware:</strong> Remembers what we discussed</li>
142
+
143
+ <li><strong>Intent parsing:</strong> Understands what you mean, not just what you say</li>
144
+
145
+ </ul>""",
146
+
147
+ try_it="'what's the time'",
148
+
149
+ why_important="90% of FRIDAY is voice - master this!",
150
+
151
+ ),
152
+
153
+
154
+
155
+ TourStep(
156
+
157
+ step_id="hotkey",
158
+
159
+ category="basics",
160
+
161
+ title="The Secret Hotkey",
162
+
163
+ voice_intro="There's a secret hotkey that shows my status without speaking. It's F6 then F2 then F9 pressed together.",
164
+
165
+ voice_hint="got it",
166
+
167
+ feature_intro="""<h3>The Hotkey Sequence: F6 + F2 + F9</h3>
168
+
169
+ <div class="warning"><strong>SECURITY:</strong> This hotkey is how you interact with me BEFORE activation.</div>
170
+
171
+
172
+
173
+ <h4>What It Does:</h4>
174
+
175
+ <ul>
176
+
177
+ <li><strong>Before激活:</strong> Shows activation prompt</li>
178
+
179
+ <li><strong>After激活:</strong> Shows full status (mode, memory, CPU)</li>
180
+
181
+ <li><strong>Anytime:</strong> Interrupts current operation</li>
182
+
183
+ </ul>
184
+
185
+
186
+
187
+ <h4>Why It Exists:</h4>
188
+
189
+ <p>The hotkey bypasses voice recognition. Useful when:</p>
190
+
191
+ <ul>
192
+
193
+ <li>Voice isn't working</li>
194
+
195
+ <li>Environment is noisy</li>
196
+
197
+ <li>You need exact commands</li>
198
+
199
+ </ul>""",
200
+
201
+ try_it="press F6 F2 F9",
202
+
203
+ why_important="Your secret weapon for reliable control.",
204
+
205
+ ),
206
+
207
+
208
+
209
+ TourStep(
210
+
211
+ step_id="personality",
212
+
213
+ category="basics",
214
+
215
+ title="6 Personality Modes",
216
+
217
+ voice_intro="I have 6 different personalities. Say 'personality' plus the name to switch.",
218
+
219
+ voice_hint="show me",
220
+
221
+ feature_intro="""<h3>Personality Modes</h3>
222
+
223
+ <table>
224
+
225
+ <tr><td>🎭 <strong>Stark</strong></td><td>Tony Stark - Witty, confident, helpful</td></tr>
226
+
227
+ <tr><td>🎯 <strong>Tactical</strong></td><td>Direct, efficient, mission-focused</td></tr>
228
+
229
+ <tr><td>😌 <strong>Chill</strong></td><td>Relaxed, casual, friendly</td></tr>
230
+
231
+ <tr><td>🎮 <strong>Gaming</strong></td><td>Gamer-speak, quick responses</td></tr>
232
+
233
+ <tr><td>🚀 <strong>Mission</strong></td><td>Serious, alert, action-oriented</td></tr>
234
+
235
+ <tr><td>🛡️ <strong>Guardian</strong></td><td>Security-focused, protective</td></tr>
236
+
237
+ </table>
238
+
239
+
240
+
241
+ <h4>How To Switch:</h4>
242
+
243
+ <ul>
244
+
245
+ <li>Say: "Personality Stark"</li>
246
+
247
+ <li>Say: "Switch to Gaming"</li>
248
+
249
+ <li>Auto-switches based on context</li>
250
+
251
+ </ul>""",
252
+
253
+ try_it="'personality stark'",
254
+
255
+ why_important="Changes how I respond to you.",
256
+
257
+ ),
258
+
259
+
260
+
261
+ TourStep(
262
+
263
+ step_id="help",
264
+
265
+ category="basics",
266
+
267
+ title="Getting Help Anytime",
268
+
269
+ voice_intro="If you ever forget what I can do, just ask. I'll tell you.",
270
+
271
+ voice_hint="what can you do",
272
+
273
+ feature_intro="""<h3>Help Commands</h3>
274
+
275
+ <table>
276
+
277
+ <tr><td><code>"What can you do?"</code></td><td>List all capabilities</td></tr>
278
+
279
+ <tr><td><code>"Help me"</code></td><td>Interactive help</td></tr>
280
+
281
+ <tr><td><code>"List commands"</code></td><td>All voice commands</td></tr>
282
+
283
+ <tr><td><code>"How do I..."</code></td><td>Specific help</td></tr>
284
+
285
+ </table>
286
+
287
+
288
+
289
+ <h4>Context Help:</h4>
290
+
291
+ <ul>
292
+
293
+ <li>Say "Help with [app]" for app-specific commands</li>
294
+
295
+ <li>Say "What commands for [feature]?" for features</li>
296
+
297
+ <li>Say "Show my shortcuts" for quick commands</li>
298
+
299
+ </ul>""",
300
+
301
+ try_it="'what can you do'",
302
+
303
+ why_important="Never get stuck - just ask!",
304
+
305
+ ),
306
+
307
+
308
+
309
+ # ═══════════════════════════════════════════════════════════════
310
+
311
+ # SECTION 2: SYSTEM CONTROL (Steps 6-15)
312
+
313
+ # ═══════════════════════════════════════════════════════════════
314
+
315
+ TourStep(
316
+
317
+ step_id="volume",
318
+
319
+ category="system",
320
+
321
+ title="Volume Control",
322
+
323
+ voice_intro="I can control your system volume with commands. Say 'volume' plus a number.",
324
+
325
+ voice_hint="test it",
326
+
327
+ feature_intro="""<h3>Volume Commands</h3>
328
+
329
+ <table>
330
+
331
+ <tr><td><code>"Volume 50"</code></td><td>Set to 50%</td></tr>
332
+
333
+ <tr><td><code>"Volume up"</code></td><td>Increase 5%</td></tr>
334
+
335
+ <tr><td><code>"Volume down"</code></td><td>Decrease 5%</td></tr>
336
+
337
+ <tr><td><code>"Volume 0" or "Mute"</code></td><td>Full mute</td></tr>
338
+
339
+ <tr><td><code>"Max volume"</code></td><td>100% volume</td></tr>
340
+
341
+ </table>
342
+
343
+
344
+
345
+ <h4>Advanced:</h4>
346
+
347
+ <ul>
348
+
349
+ <li>Say "Percentage" for exact control</li>
350
+
351
+ <li>Say "too loud/quiet" for adjustment</li>
352
+
353
+ <li>Say "reset volume" to return to 50%</li>
354
+
355
+ </ul>""",
356
+
357
+ try_it="'volume 75'",
358
+
359
+ why_important="Essential daily control!",
360
+
361
+ ),
362
+
363
+
364
+
365
+ TourStep(
366
+
367
+ step_id="brightness",
368
+
369
+ category="system",
370
+
371
+ title="Display Brightness",
372
+
373
+ voice_intro="I can adjust your screen brightness too. Works on most laptops.",
374
+
375
+ voice_hint="bright",
376
+
377
+ feature_intro="""<h3>Brightness Commands</h3>
378
+
379
+ <table>
380
+
381
+ <tr><td><code>"Brightness 50"</code></td><td>Set to 50%</td></tr>
382
+
383
+ <tr><td><code>"Increase brightness"</code></td><td>Brighter</td></tr>
384
+
385
+ <tr><td><code>"Decrease brightness"</code></td><td>Dimmer</td></tr>
386
+
387
+ <tr><td><code>"Dim it"</code></td><td>Minimum brightness</td></tr>
388
+
389
+ </table>
390
+
391
+
392
+
393
+ <h4>Related Features:</h4>
394
+
395
+ <ul>
396
+
397
+ <li><code>"Night light on"</code> - Warm colors for night</li>
398
+
399
+ <li><code>"HDR on/off"</code> - HDR toggle</li>
400
+
401
+ <li><code>"Cycle brightness"</code> - Rotate presets</li>
402
+
403
+ </ul>""",
404
+
405
+ try_it="'brightness 50'",
406
+
407
+ why_important="Protect your eyes!",
408
+
409
+ ),
410
+
411
+
412
+
413
+ TourStep(
414
+
415
+ step_id="wifi",
416
+
417
+ category="system",
418
+
419
+ title="Wi-Fi & Bluetooth",
420
+
421
+ voice_intro="Wi-Fi and Bluetooth controls - say 'Wi-Fi on' or 'Bluetooth off'.",
422
+
423
+ voice_hint="control",
424
+
425
+ feature_intro="""<h3>Network Controls</h3>
426
+
427
+ <table>
428
+
429
+ <tr><td><code>"Wi-Fi on/off"</code></td><td>Toggle Wi-Fi</td></tr>
430
+
431
+ <tr><td><code>"Bluetooth on/off"</code></td><td>Toggle Bluetooth</td></tr>
432
+
433
+ <tr><td><code>"Airplane mode on/off"</code></td><td>Fight mode</td></tr>
434
+
435
+ <tr><td><code>"Show networks"</code></td><td>List Wi-Fi networks</td></tr>
436
+
437
+ </table>
438
+
439
+
440
+
441
+ <h4>Quick Connect:</h4>
442
+
443
+ <ul>
444
+
445
+ <li>Say "Connect to [network name]"</li>
446
+
447
+ <li>Say "Forget [network]" to remove</li>
448
+
449
+ <li>Say "What's my IP?" to see address</li>
450
+
451
+ </ul>""",
452
+
453
+ try_it="'wi-fi on'",
454
+
455
+ why_important="Instant network control!",
456
+
457
+ ),
458
+
459
+
460
+
461
+ TourStep(
462
+
463
+ step_id="apps",
464
+
465
+ category="system",
466
+
467
+ title="App Control",
468
+
469
+ voice_intro="I can open and close any application. Say 'Open [app name]'.",
470
+
471
+ voice_hint="ready",
472
+
473
+ feature_intro="""<h3>App Control</h3>
474
+
475
+ <table>
476
+
477
+ <tr><td><code>"Open Chrome"</code></td><td>Launch browser</td></tr>
478
+
479
+ <tr><td><code>"Open Spotify"</code></td><td>Launch music</td></tr>
480
+
481
+ <tr><td><code>"Open Discord"</code></td><td>Launch chat</td></tr>
482
+
483
+ <tr><td><code>"Close Chrome"</code></td><td>Close app</td></tr>
484
+
485
+ <tr><td><code>"Restart [app]"</code></td><td>Force restart</td></tr>
486
+
487
+ </table>
488
+
489
+
490
+
491
+ <h4>Universal:</h4>
492
+
493
+ <p>Say "Open [anything]" - I can launch ANY installed app!</p>""",
494
+
495
+ try_it="'open notepad'",
496
+
497
+ why_important="Single voice command for ANY app!",
498
+
499
+ ),
500
+
501
+
502
+
503
+ TourStep(
504
+
505
+ step_id="window",
506
+
507
+ category="system",
508
+
509
+ title="Window Management",
510
+
511
+ voice_intro="Move and resize windows with voice. Like 'maximize window' or 'snap left'.",
512
+
513
+ voice_hint="move it",
514
+
515
+ feature_intro="""<h3>Window Commands</h3>
516
+
517
+ <table>
518
+
519
+ <tr><td><code>"Maximize window"</code></td><td>Full screen</td></tr>
520
+
521
+ <tr><td><code>"Minimize window"</code></td><td>To taskbar</td></tr>
522
+
523
+ <tr><td><code>"Snap left/right"</code></td><td>Half screen</td></tr>
524
+
525
+ <tr><td><code>"Center window"</code></td><td>Middle screen</td></tr>
526
+
527
+ <tr><td><code>"Tile windows"</code></td><td>Arrange all</td></tr>
528
+
529
+ </table>
530
+
531
+
532
+
533
+ <h4>Virtual Desktops:</h4>
534
+
535
+ <ul>
536
+
537
+ <li>Say "New desktop" - Create workspace</li>
538
+
539
+ <li>Say "Switch desktop" - Move between</li>
540
+
541
+ <li>Say "Close desktop" - Delete workspace</li>
542
+
543
+ </ul>""",
544
+
545
+ try_it="'maximize window'",
546
+
547
+ why_important="Mouse-free window control!",
548
+
549
+ ),
550
+
551
+
552
+
553
+ TourStep(
554
+
555
+ step_id="power",
556
+
557
+ category="system",
558
+
559
+ title="Power Management",
560
+
561
+ voice_intro="Shutdown, restart, sleep - all with voice commands.",
562
+
563
+ voice_hint="power",
564
+
565
+ feature_intro="""<h3>Power Commands</h3>
566
+
567
+ <table>
568
+
569
+ <tr><td><code>"Lock PC"</code></td><td>Lock screen</td></tr>
570
+
571
+ <tr><td><code>"Sleep"</code></td><td>Sleep mode</td></tr>
572
+
573
+ <tr><td><code>"Restart"</code></td><td>Reboot</td></tr>
574
+
575
+ <tr><td><code>"Shut down"</code></td><td>Power off</td></tr>
576
+
577
+ <tr><td><code>"Sign out"</code></td><td>Log off</td></tr>
578
+
579
+ </table>
580
+
581
+
582
+
583
+ <h4>Timer:</h4>
584
+
585
+ <ul>
586
+
587
+ <li>Say "Shut down in 30 minutes"</li>
588
+
589
+ <li>Say "Restart at 6 PM"</li>
590
+
591
+ <li>Say "Cancel shutdown" to abort</li>
592
+
593
+ </ul>""",
594
+
595
+ try_it="'lock pc'",
596
+
597
+ why_important="Complete power control!",
598
+
599
+ ),
600
+
601
+
602
+
603
+ TourStep(
604
+
605
+ step_id="screenshot",
606
+
607
+ category="system",
608
+
609
+ title="Screenshots & Recording",
610
+
611
+ voice_intro="Capture your screen with voice. Say 'take a screenshot'.",
612
+
613
+ voice_hint="capture",
614
+
615
+ feature_intro="""<h3>Screenshot Commands</h3>
616
+
617
+ <table>
618
+
619
+ <tr><td><code>"Take a screenshot"</code></td><td>Capture screen</td></tr>
620
+
621
+ <tr><td><code>"Record screen"</code></td><td>Start recording</td></tr>
622
+
623
+ <tr><td><code>"Stop recording"</code></td><td>End recording</td></tr>
624
+
625
+ <tr><td><code>"Copy screen"</code></td><td>To clipboard</td></tr>
626
+
627
+ </table>
628
+
629
+
630
+
631
+ <h4>Region Capture:</h4>
632
+
633
+ <ul>
634
+
635
+ <li>Say "Capture [app] window"</li>
636
+
637
+ <li>Say "Screenshot in 5 seconds"</li>
638
+
639
+ <li>Files save to Pictures/FRIDAY</li>
640
+
641
+ </ul>""",
642
+
643
+ try_it="'take a screenshot'",
644
+
645
+ why_important="Instant capture without buttons!",
646
+
647
+ ),
648
+
649
+
650
+
651
+ TourStep(
652
+
653
+ step_id="clipboard",
654
+
655
+ category="system",
656
+
657
+ title="Clipboard Intelligence",
658
+
659
+ voice_intro="I remember your clipboard and can smart-paste. Say 'paste' for intelligent paste.",
660
+
661
+ voice_hint="clipboard",
662
+
663
+ feature_intro="""<h3>Clipboard Commands</h3>
664
+
665
+ <table>
666
+
667
+ <tr><td><code>"What's in clipboard"</code></td><td>Show contents</td></tr>
668
+
669
+ <tr><td><code>"Clear clipboard"</code></td><td>Empty clipboard</td></tr>
670
+
671
+ <tr><td><code>"Copy that"</code></td><td>Re-copy last item</td></tr>
672
+
673
+ <tr><td><code>"Clipboard history"</code></td><td>Show last 10</td></tr>
674
+
675
+ </table>
676
+
677
+
678
+
679
+ <h4>Smart Features:</h4>
680
+
681
+ <ul>
682
+
683
+ <li>Auto-remembers copied items</li>
684
+
685
+ <li>Intelligent paste (formats data)</li>
686
+
687
+ <li>Phone clipboard sync (optional)</li>
688
+
689
+ </ul>""",
690
+
691
+ try_it="'clipboard history'",
692
+
693
+ why_important="Your digital memory!",
694
+
695
+ ),
696
+
697
+
698
+
699
+ TourStep(
700
+
701
+ step_id="files",
702
+
703
+ category="system",
704
+
705
+ title="File Operations",
706
+
707
+ voice_intro="Find, open, organize files with voice. Say 'find [file name]'.",
708
+
709
+ voice_hint="files",
710
+
711
+ feature_intro="""<h3>File Commands</h3>
712
+
713
+ <table>
714
+
715
+ <tr><td><code>"Find [filename]"</code></td><td>Search files</td></tr>
716
+
717
+ <tr><td><code>"Open [path]"</code></td><td>Open file</td></tr>
718
+
719
+ <tr><td><code>"New folder [name]"</code></td><td>Create folder</td></tr>
720
+
721
+ <tr><td><code>"Show downloads"</code></td><td>Open downloads</td></tr>
722
+
723
+ </table>
724
+
725
+
726
+
727
+ <h4>Recent Files:</h4>
728
+
729
+ <ul>
730
+
731
+ <li>Say "Recent files" for history</li>
732
+
733
+ <li>Say "Organize desktop" to tidy</li>
734
+
735
+ <li>Say "File details [name]" for info</li>
736
+
737
+ </ul>""",
738
+
739
+ try_it="'find document'",
740
+
741
+ why_important="Find anything instantly!",
742
+
743
+ ),
744
+
745
+
746
+
747
+ # ═══════════════════════════════════════════════════════════════
748
+
749
+ # SECTION 3: VOICE & AUDIO (Steps 16-20)
750
+
751
+ # ═══════════════════════════════════════════════════════════════
752
+
753
+ TourStep(
754
+
755
+ step_id="music",
756
+
757
+ category="audio",
758
+
759
+ title="Music Control",
760
+
761
+ voice_intro="Control Spotify and any music player. 'Play', 'pause', 'next song'.",
762
+
763
+ voice_hint="music",
764
+
765
+ feature_intro="""<h3>Music Commands</h3>
766
+
767
+ <table>
768
+
769
+ <tr><td><code>"Play music"</code></td><td>Start Spotify</td></tr>
770
+
771
+ <tr><td><code>"Play"</code></td><td>Resume</td></tr>
772
+
773
+ <tr><td><code>"Pause"</code></td><td>Pause</td></tr>
774
+
775
+ <tr><td><code>"Next song"</code></td><td>Skip</td></tr>
776
+
777
+ <tr><td><code>"Previous song"</code></td><td>Go back</td></tr>
778
+
779
+ </table>
780
+
781
+
782
+
783
+ <h4>Search & Play:</h4>
784
+
785
+ <ul>
786
+
787
+ <li>Say "Search YouTube for [song]"</li>
788
+
789
+ <li>Say "Play [artist]"</li>
790
+
791
+ <li>Say "Play my liked songs"</li>
792
+
793
+ </ul>""",
794
+
795
+ try_it="'play music'",
796
+
797
+ why_important="Full voice music control!",
798
+
799
+ ),
800
+
801
+
802
+
803
+ TourStep(
804
+
805
+ step_id="voice_modes",
806
+
807
+ category="audio",
808
+
809
+ title="Voice Modes",
810
+
811
+ voice_intro="I have speaking modes. 'Whisper mode' for quiet responses, 'broadcast mode' for loud.",
812
+
813
+ voice_hint="whisper",
814
+
815
+ feature_intro="""<h3>Voice Modes</h3>
816
+
817
+ <table>
818
+
819
+ <tr><td><code>"Whisper mode"</code></td><td>Quiet responses</td></tr>
820
+
821
+ <tr><td><code>"Normal mode"</code></td><td>Default volume</td></tr>
822
+
823
+ <tr><td><code>"Broadcast"</code></td><td>Loud announcements</td></tr>
824
+
825
+ <tr><td><code>"Silent mode"</code></td><td>Text-only responses</td></tr>
826
+
827
+ </table>
828
+
829
+
830
+
831
+ <h4>Quick Toggles:</h4>
832
+
833
+ <ul>
834
+
835
+ <li>Say "Don't talk loud"</li>
836
+
837
+ <li>Say "Be quiet"</li>
838
+
839
+ <li>Say "Use short responses"</li>
840
+
841
+ </ul>""",
842
+
843
+ try_it="'whisper mode'",
844
+
845
+ why_important="Perfect for different situations!",
846
+
847
+ ),
848
+
849
+
850
+
851
+ # ═══════════════════════════════════════════════════════════════
852
+
853
+ # SECTION 4: REMINDERS & TASKS (Steps 21-28)
854
+
855
+ # ═══════════════════════════════════════════════════════════════
856
+
857
+ TourStep(
858
+
859
+ step_id="reminders",
860
+
861
+ category="tasks",
862
+
863
+ title="Reminders",
864
+
865
+ voice_intro="Set reminders with natural speech. Say 'remind me to [task] in [time]'.",
866
+
867
+ voice_hint="set one",
868
+
869
+ feature_intro="""<h3>Reminder Commands</h3>
870
+
871
+ <table>
872
+
873
+ <tr><td><code>"Remind me to [task]"</code></td><td>Set in 30 min</td></tr>
874
+
875
+ <tr><td><code>"Remind me at [time]"</code></td><td>Specific time</td></tr>
876
+
877
+ <tr><td><code>"What's my schedule"</code></td><td>Show all</td></tr>
878
+
879
+ <tr><td><code>"Clear reminders"</code></td><td>Remove all</td></tr>
880
+
881
+ </table>
882
+
883
+
884
+
885
+ <h4>Natural Time:</h4>
886
+
887
+ <ul>
888
+
889
+ <li>"in 5 minutes"</li>
890
+
891
+ <li>"at 3 PM"</li>
892
+
893
+ <li>"tomorrow morning"</li>
894
+
895
+ <li>"next Monday"</li>
896
+
897
+ </ul>""",
898
+
899
+ try_it="'remind me to drink water in 30 minutes'",
900
+
901
+ why_important="Never forget anything!",
902
+
903
+ ),
904
+
905
+
906
+
907
+ TourStep(
908
+
909
+ step_id="routines",
910
+
911
+ category="tasks",
912
+
913
+ title="Routines & Habits",
914
+
915
+ voice_intro="Create routines for repeated tasks. Say 'create routine [name]' or 'new routine'.",
916
+
917
+ voice_hint="routines",
918
+
919
+ feature_intro="""<h3>Routine Commands</h3>
920
+
921
+ <table>
922
+
923
+ <tr><td><code>"Create routine [name]"</code></td><td>Start creation</td></tr>
924
+
925
+ <tr><td><code>"Run routine [name]"</code></td><td>Execute</td></tr>
926
+
927
+ <tr><td><code>"List routines"</code></td><td>Show all</td></tr>
928
+
929
+ <tr><td><code>"Edit routine [name]"</code></td><td>Modify</td></tr>
930
+
931
+ </table>
932
+
933
+
934
+
935
+ <h4>Example:</h4>
936
+
937
+ <p>"Create morning routine" → add actions → done!</p>""",
938
+
939
+ try_it="'create routine morning'",
940
+
941
+ why_important="Automate your daily tasks!",
942
+
943
+ ),
944
+
945
+
946
+
947
+ TourStep(
948
+
949
+ step_id="calendar",
950
+
951
+ category="tasks",
952
+
953
+ title="Calendar & Events",
954
+
955
+ voice_intro="Add events to calendar. Say 'add to calendar [event]'.",
956
+
957
+ voice_hint="calendar",
958
+
959
+ feature_intro="""<h3>Calendar Commands</h3>
960
+
961
+ <table>
962
+
963
+ <tr><td><code>"Add to calendar [event]"</code></td><td>Add event</td></tr>
964
+
965
+ <tr><td><code>"What's on [day]?"</code></td><td>Show events</td></tr>
966
+
967
+ <tr><td><code>"My schedule"</code></td><td>Today</td></tr>
968
+
969
+ <tr><td><code>"Remove [event]"</code></td><td>Delete</td></tr>
970
+
971
+ </table>
972
+
973
+
974
+
975
+ <h4>Natural Input:</h4>
976
+
977
+ <ul>
978
+
979
+ <li>"Meeting tomorrow at 3"</li>
980
+
981
+ <li>"Lunch with John Friday"</li>
982
+
983
+ <li>"Call mom Saturday 10am"</li>
984
+
985
+ </ul>""",
986
+
987
+ try_it="'add to calendar team meeting tomorrow at 3 pm'",
988
+
989
+ why_important="Voice calendar!",
990
+
991
+ ),
992
+
993
+
994
+
995
+ TourStep(
996
+
997
+ step_id="habits",
998
+
999
+ category="tasks",
1000
+
1001
+ title="Habit Tracking",
1002
+
1003
+ voice_intro="Track habits you want to build. Say 'track [habit]' or 'log [habit]'.",
1004
+
1005
+ voice_hint="habits",
1006
+
1007
+ feature_intro="""<h3>Habit Tracking</h3>
1008
+
1009
+ <table>
1010
+
1011
+ <tr><td><code>"Track [habit]"</code></td><td>Start tracking</td></tr>
1012
+
1013
+ <tr><td><code>"Log [habit]"</code></td><td>Mark done</td></tr>
1014
+
1015
+ <tr><td><code>"My habits"</code></td><td>Show status</td></tr>
1016
+
1017
+ <tr><td><code>"Habit stats"</code></td><td>Statistics</td></tr>
1018
+
1019
+ </table>
1020
+
1021
+
1022
+
1023
+ <h4>Examples:</h4>
1024
+
1025
+ <ul>
1026
+
1027
+ <li>"Track drinking water"</li>
1028
+
1029
+ <li>"Log meditation"</li>
1030
+
1031
+ <li>"Track reading"</li>
1032
+
1033
+ </ul>""",
1034
+
1035
+ try_it="'log reading'",
1036
+
1037
+ why_important="Build better habits!",
1038
+
1039
+ ),
1040
+
1041
+
1042
+
1043
+ # ═══════════════════════════════════════════════════════════════
1044
+
1045
+ # SECTION 5: AI BRAIN (Steps 29-35)
1046
+
1047
+ # ═══════════════════════════════════════════════════════════════
1048
+
1049
+ TourStep(
1050
+
1051
+ step_id="ai_executor",
1052
+
1053
+ category="ai",
1054
+
1055
+ title="AI Task Executor",
1056
+
1057
+ voice_intro="Here's the magic - I can do ANY task you describe using AI. Just say 'execute [task]'.",
1058
+
1059
+ voice_hint="execute",
1060
+
1061
+ feature_intro="""<h3>AI Executor</h3>
1062
+
1063
+ <p>Unlike fixed commands, I use AI to understand and execute ANY task:</p>
1064
+
1065
+
1066
+
1067
+ <table>
1068
+
1069
+ <tr><td><code>"Research [topic]"</code></td><td>Find info online</td></tr>
1070
+
1071
+ <tr><td><code>"Analyze [file]"</code></td><td>AI document analysis</td></tr>
1072
+
1073
+ <tr><td><code>"Write [something]"</code></td><td>Generate content</td></tr>
1074
+
1075
+ <tr><td><code>"Calculate [math]"</code></td><td>Do math</td></tr>
1076
+
1077
+ </table>
1078
+
1079
+
1080
+
1081
+ <h4>Chain Commands:</h4>
1082
+
1083
+ <p>Say "Do X and Y then Z" for multi-step tasks!</p>""",
1084
+
1085
+ try_it="'research quantum computing'",
1086
+
1087
+ why_important="UNLIMITED Tasks - I can do ANYTHING!",
1088
+
1089
+ ),
1090
+
1091
+
1092
+
1093
+ TourStep(
1094
+
1095
+ step_id="memory",
1096
+
1097
+ category="ai",
1098
+
1099
+ title="Memory System",
1100
+
1101
+ voice_intro="I remember our conversations. Say 'remember that' or 'what did I say about'.",
1102
+
1103
+ voice_hint="memory",
1104
+
1105
+ feature_intro="""<h3>Memory Commands</h3>
1106
+
1107
+ <table>
1108
+
1109
+ <tr><td><code>"Remember that [info]"</code></td><td>Save information</td></tr>
1110
+
1111
+ <tr><td><code>"What did I tell you about [topic]?"</code></td><td>Recall</td></tr>
1112
+
1113
+ <tr><td><code>"Forget [topic]"</code></td><td>Remove</td></tr>
1114
+
1115
+ <tr><td><code>"My memories"</code></td><td>List all</td></tr>
1116
+
1117
+ </table>
1118
+
1119
+
1120
+
1121
+ <h4>Auto-Memory:</h4>
1122
+
1123
+ <ul>
1124
+
1125
+ <li>I remember important things automaticall</li>
1126
+
1127
+ <li>Context carries across sessions</li>
1128
+
1129
+ <li>Deep memory for long-term</li>
1130
+
1131
+ </ul>""",
1132
+
1133
+ try_it="'remember that i prefer dark mode'",
1134
+
1135
+ why_important="I never forget!",
1136
+
1137
+ ),
1138
+
1139
+
1140
+
1141
+ TourStep(
1142
+
1143
+ step_id="mood",
1144
+
1145
+ category="ai",
1146
+
1147
+ title="Mood Detection",
1148
+
1149
+ voice_intro="I detect your mood and adjust responses. I can tell if you're happy, stressed, or tired.",
1150
+
1151
+ voice_hint="mood",
1152
+
1153
+ feature_intro="""<h3>Mood Detection</h3>
1154
+
1155
+ <p>I analyze your voice and behavior to detect mood:</p>
1156
+
1157
+
1158
+
1159
+ <table>
1160
+
1161
+ <tr><td>😄 <strong>Happy</strong></td><td>Cheerful responses</td></tr>
1162
+
1163
+ <tr><td>😐 <strong>Neutral</strong></td><td>Standard responses</td></tr>
1164
+
1165
+ <tr><td>😔 <strong>Sad</strong></td><td>Sympathetic responses</td></tr>
1166
+
1167
+ <tr><td>😤 <strong>Frustrated</strong></td><td>Helpful, patient</td></tr>
1168
+
1169
+ </table>
1170
+
1171
+
1172
+
1173
+ <h4>Manual Override:</h4>
1174
+
1175
+ <ul>
1176
+
1177
+ <li>Say "I'm feeling [mood]"</li>
1178
+
1179
+ <li>Say "Be more [personality]"</li>
1180
+
1181
+ </ul>""",
1182
+
1183
+ try_it="how do i feel",
1184
+
1185
+ why_important="I adapt to you!",
1186
+
1187
+ ),
1188
+
1189
+
1190
+
1191
+ # ═══════════════════════════════════════════════════════════════════════
1192
+
1193
+ # SECTION 6: SECURITY (Steps 36-42)
1194
+
1195
+ # ═══════════════════════════════════════════════════════════════
1196
+
1197
+ TourStep(
1198
+
1199
+ step_id="emergency",
1200
+
1201
+ category="security",
1202
+
1203
+ title="Emergency Mode",
1204
+
1205
+ voice_intro="Say 'emergency mode' for red alert. Activates all security protocols.",
1206
+
1207
+ voice_hint="emergency",
1208
+
1209
+ feature_intro="""<h3>Emergency Mode</h3>
1210
+
1211
+ <div class="warning"><strong>RED ALERT - ALL SYSTEMS HIGH</strong></div>
1212
+
1213
+
1214
+
1215
+ <table>
1216
+
1217
+ <tr><td><code>"Emergency mode"</code></td><td>Activate red alert</td></tr>
1218
+
1219
+ <tr><td><code>"Disable emergency"</code></td><td>Deactivate</td></tr>
1220
+
1221
+ <tr><td><code>"Security status"</code></td><td>Check security</td></tr>
1222
+
1223
+ </table>
1224
+
1225
+
1226
+
1227
+ <h4>What Happens:</h4>
1228
+
1229
+ <ul>
1230
+
1231
+ <li>Enhanced monitoring</li>
1232
+
1233
+ <li>Full logging</li>
1234
+
1235
+ <li>Strict authentication</li>
1236
+
1237
+ <li>Alert notifications</li>
1238
+
1239
+ </ul>""",
1240
+
1241
+ try_it="'emergency mode'",
1242
+
1243
+ why_important="Maximum security when needed!",
1244
+
1245
+ ),
1246
+
1247
+
1248
+
1249
+ TourStep(
1250
+
1251
+ step_id="firewall",
1252
+
1253
+ category="security",
1254
+
1255
+ title="Firewall Control",
1256
+
1257
+ voice_intro="Voice-controlled Windows firewall. Say 'check firewall'.",
1258
+
1259
+ voice_hint="firewall",
1260
+
1261
+ feature_intro="""<h3>Firewall Commands</h3>
1262
+
1263
+ <table>
1264
+
1265
+ <tr><td><code>"Check firewall"</code></td><td>Show status</td></tr>
1266
+
1267
+ <tr><td><code>"Enable firewall"</code></td><td>Turn on</td></tr>
1268
+
1269
+ <tr><td><code>"Disable firewall"</code></td><td>Turn off</td></tr>
1270
+
1271
+ <tr><td><code>"Firewall status"</code></td><td>Detailed view</td></tr>
1272
+
1273
+ </table>
1274
+
1275
+
1276
+
1277
+ <div class="warning"><strong>Note:</strong> May need admin for changes.</div>""",
1278
+
1279
+ try_it="'check firewall'",
1280
+
1281
+ why_important="Voice firewall control!",
1282
+
1283
+ ),
1284
+
1285
+
1286
+
1287
+ # ═══════════════════════════════════════════════════════════════
1288
+
1289
+ # SECTION 7: INFO & WEATHER (Steps 43-48)
1290
+
1291
+ # ═══════════════════════════════════════════════════════════════
1292
+
1293
+ TourStep(
1294
+
1295
+ step_id="weather",
1296
+
1297
+ category="info",
1298
+
1299
+ title="Weather",
1300
+
1301
+ voice_intro="Get weather info instantly. Say 'what's the weather' or 'will it rain'.",
1302
+
1303
+ voice_hint="weather",
1304
+
1305
+ feature_intro="""<h3>Weather Commands</h3>
1306
+
1307
+ <table>
1308
+
1309
+ <tr><td><code>"What's the weather"</code></td><td>Current</td></tr>
1310
+
1311
+ <tr><td><code>"Weather forecast"</code></td><td>3-day</td></tr>
1312
+
1313
+ <tr><td><code>"Will it rain"</code></td><td>Rain check</td></tr>
1314
+
1315
+ <tr><td><code>"Temperature"</code></td><td>Current temp</td></tr>
1316
+
1317
+ </table>
1318
+
1319
+
1320
+
1321
+ <h4>Extended:</h4>
1322
+
1323
+ <ul>
1324
+
1325
+ <li>"Weather for [city]"- Remote check</li>
1326
+
1327
+ <li>"Weekend weather"- Plan ahead</li>
1328
+
1329
+ <li>"Best time for [activity]"- Recommendation</li>
1330
+
1331
+ </ul>""",
1332
+
1333
+ try_it="'what's the weather'",
1334
+
1335
+ why_important="Always be prepared!",
1336
+
1337
+ ),
1338
+
1339
+
1340
+
1341
+ TourStep(
1342
+
1343
+ step_id="health",
1344
+
1345
+ category="info",
1346
+
1347
+ title="System Health",
1348
+
1349
+ voice_intro="Monitor your PC's health. Say 'health report' or 'system status'.",
1350
+
1351
+ voice_hint="health",
1352
+
1353
+ feature_intro="""<h3>Health Commands</h3>
1354
+
1355
+ <table>
1356
+
1357
+ <tr><td><code>"Health report"</code></td><td>Full diagnostics</td></tr>
1358
+
1359
+ <tr><td><code>"System status"</code></td><td>Quick overview</td></tr>
1360
+
1361
+ <tr><td><code>"RAM usage"</code></td><td>Memory check</td></tr>
1362
+
1363
+ <tr><td><code>"CPU temperature"</code></td><td>Temp check</td></tr>
1364
+
1365
+ </table>
1366
+
1367
+
1368
+
1369
+ <h4>Monitoring:</h4>
1370
+
1371
+ <ul>
1372
+
1373
+ <li>I track CPU, RAM, disk</li>
1374
+
1375
+ <li>Temperature trends</li>
1376
+
1377
+ <li>Performance alerts</li>
1378
+
1379
+ </ul>""",
1380
+
1381
+ try_it="'health report'",
1382
+
1383
+ why_important="Know your PC's status!",
1384
+
1385
+ ),
1386
+
1387
+
1388
+
1389
+ # ═══════════════════════════════════════════════════════════════
1390
+
1391
+ # SECTION 8: PHONE & AR (Steps 49-55)
1392
+
1393
+ # ═══════════════════════════════════════════════════════════════
1394
+
1395
+ TourStep(
1396
+
1397
+ step_id="phone",
1398
+
1399
+ category="phone",
1400
+
1401
+ title="Phone Control",
1402
+
1403
+ voice_intro="Control your PC from your phone using Tailscale VPN. Optional but powerful.",
1404
+
1405
+ voice_hint="phone",
1406
+
1407
+ feature_intro="""<h3>Phone Control</h3>
1408
+
1409
+ <p>Control FRIDAY from your Android phone:</p>
1410
+
1411
+
1412
+
1413
+ <table>
1414
+
1415
+ <tr><td>📱 <strong>APK</strong></td><td>FridayLink app</td></tr>
1416
+
1417
+ <tr><td>🌐 <strong>Tailscale</strong></td><td>VPN connection</td></tr>
1418
+
1419
+ <tr><td>🎤 <strong>Voice</strong></td><td>Speak commands</td></tr>
1420
+
1421
+ <tr><td>🖥️ <strong>Screen</strong></td><td>View PC</td></tr>
1422
+
1423
+ </table>
1424
+
1425
+
1426
+
1427
+ <h4>Setup:</h4>
1428
+
1429
+ <ol>
1430
+
1431
+ <li>Install APK from phone/android/</li>
1432
+
1433
+ <li>Install Tailscale on both</li>
1434
+
1435
+ <li>Connect via Tailscale IP</li>
1436
+
1437
+ </ol>""",
1438
+
1439
+ try_it="phone connected",
1440
+
1441
+ why_important="Control PC from anywhere!",
1442
+
1443
+ ),
1444
+
1445
+
1446
+
1447
+ TourStep(
1448
+
1449
+ step_id="ar",
1450
+ category="ar",
1451
+ title="Omni-AR System",
1452
+ voice_intro="Behold the Omni-AR System! Industrial-grade holograms with real-time scene patching. Say 'enable AR' to launch the HUD.",
1453
+
1454
+ voice_hint="ar",
1455
+
1456
+ feature_intro="""<h3>Omni-AR Mode</h3>
1457
+ <p>Real-time holographic projections synced across PC and Phone.</p>
1458
+ <table>
1459
+ <tr><td><code>"Enable AR"</code></td><td>Initialize HUD</td></tr>
1460
+ <tr><td><code>"AR preset table"</code></td><td>Holographic Workspace</td></tr>
1461
+ <tr><td><code>"AR preset helmet"</code></td><td>Face-Tracked HUD</td></tr>
1462
+ </table>
1463
+ <h4 class="text-primary">New Capabilities:</h4>
1464
+ <ul>
1465
+ <li>Low-Latency State Sync (8ms)</li>
1466
+ <li>Dynamic Scene Patching</li>
1467
+ <li>ArUco Marker Tracking</li>
1468
+ </ul>
1469
+
1470
+
1471
+
1472
+ <h4>Presets:</h4>
1473
+
1474
+ <ul>
1475
+
1476
+ <li><strong>Table:</strong> ArUco marker holograms</li>
1477
+
1478
+ <li><strong>Helmet:</strong> Face-tracked HUD</li>
1479
+
1480
+ <li><strong>Float:</strong> Floating holograms</li>
1481
+
1482
+ </ul>""",
1483
+
1484
+ try_it="'enable ar'",
1485
+
1486
+ why_important="Tony Stark vibes! 🤖",
1487
+
1488
+ ),
1489
+
1490
+
1491
+
1492
+ # ═══════════════════════════════════════════════════════════════
1493
+
1494
+ # SECTION 9: FINAL (Steps 56-60)
1495
+
1496
+ # ═══════════════════════════════════════════════════════════════
1497
+
1498
+ TourStep(
1499
+
1500
+ step_id="ai_brain",
1501
+ category="ai",
1502
+ title="Jarvis Intelligence",
1503
+ voice_intro="Finally, meet the heart of the system: Jarvis Intelligence. I don't just answer questions—I understand your objectives and predict your needs.",
1504
+
1505
+ voice_hint="ask me",
1506
+
1507
+ feature_intro="""<h3>Jarvis Intelligence - The Cognitive Core</h3>
1508
+
1509
+ <p>Powered by Gemini 2.5 Flash:</p>
1510
+
1511
+
1512
+
1513
+ <table>
1514
+
1515
+ <tr><td>💭 <strong>Questions</strong></td><td>Ask anything</td></tr>
1516
+
1517
+ <tr><td>🔬 <strong>Research</strong></td><td>Deep dive</td></tr>
1518
+
1519
+ <tr><td>✍️ <strong>Writing</strong></td><td>Generate content</td></tr>
1520
+
1521
+ <tr><td>🧮 <strong>Math</strong></td><td>Solve problems</td></tr>
1522
+
1523
+ </table>
1524
+
1525
+
1526
+
1527
+ <h4>Examples:</h4>
1528
+
1529
+ <ul>
1530
+
1531
+ <li>"Explain quantum computing"</li>
1532
+
1533
+ <li>"Write a poem about AI"</li>
1534
+
1535
+ <li>"How do I learn Python?"</li>
1536
+
1537
+ </ul>""",
1538
+
1539
+ try_it="'explain machine learning in simple terms'",
1540
+
1541
+ why_important="UNLIMITED knowledge!",
1542
+
1543
+ ),
1544
+
1545
+
1546
+
1547
+ TourStep(
1548
+
1549
+ step_id="completion",
1550
+
1551
+ category="final",
1552
+
1553
+ title="Tour Complete!",
1554
+
1555
+ voice_intro="Congratulations! You've learned every major feature. I'm ready to assist you.",
1556
+
1557
+ voice_hint="thank you",
1558
+
1559
+ feature_intro="""<h1>🎉 TOUR COMPLETE!</h1>
1560
+
1561
+
1562
+
1563
+ <p>You now know all of FRIDAY's major features:</p>
1564
+
1565
+
1566
+
1567
+ <h3>Summary:</h3>
1568
+
1569
+ <ul>
1570
+
1571
+ <li>✅ Voice Commands (500+)</li>
1572
+
1573
+ <li>✅ System Control</li>
1574
+
1575
+ <li>✅ AI Executor</li>
1576
+
1577
+ <li>✅ Memory</li>
1578
+
1579
+ <li>✅ Reminders & Routines</li>
1580
+
1581
+ <li>✅ Security</li>
1582
+
1583
+ <li>✅ Phone Control</li>
1584
+
1585
+ <li>✅ AR Mode</li>
1586
+
1587
+ </ul>
1588
+
1589
+
1590
+
1591
+ <h3>Quick Reference:</h3>
1592
+
1593
+ <ul>
1594
+
1595
+ <li><code>"Help"</code> - Get help</li>
1596
+
1597
+ <li><code>"What can you do"</code> - List features</li>
1598
+
1599
+ <li><code>"Check setup"</code> - Setup status</li>
1600
+
1601
+ </ul>
1602
+
1603
+
1604
+
1605
+ <div class="note"><strong>Tip:</strong> I learn your preferences over time. The more you use me, the better I assist you!</div>""",
1606
+
1607
+ try_it="finish tour",
1608
+
1609
+ why_important="You're a FRIDAY pro now!",
1610
+
1611
+ ),
1612
+
1613
+ ]
1614
+
1615
+
1616
+
1617
+
1618
+
1619
+ def start_tour() -> TourStep:
1620
+
1621
+ """Start the feature tour."""
1622
+
1623
+ state = {"step": 0, "started": True, "total": len(FEATURE_TOUR)}
1624
+
1625
+ save_tour_state(state)
1626
+
1627
+ return FEATURE_TOUR[0]
1628
+
1629
+
1630
+
1631
+
1632
+
1633
+ def advance_tour() -> TourStep | None:
1634
+
1635
+ """Advance to next step."""
1636
+
1637
+ state = load_tour_state()
1638
+
1639
+ idx = state.get("step", 0)
1640
+
1641
+ if idx + 1 >= len(FEATURE_TOUR):
1642
+
1643
+ return None
1644
+
1645
+ state["step"] = idx + 1
1646
+
1647
+ save_tour_state(state)
1648
+
1649
+ return FEATURE_TOUR[idx + 1]
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+ def load_tour_state() -> dict:
1656
+
1657
+ if TOUR_STATE_FILE.exists():
1658
+
1659
+ try:
1660
+
1661
+ return json.loads(TOUR_STATE_FILE.read_text(encoding="utf-8"))
1662
+
1663
+ except Exception:
1664
+
1665
+ pass
1666
+
1667
+ return {"step": 0, "started": False}
1668
+
1669
+
1670
+
1671
+
1672
+
1673
+ def save_tour_state(state: dict) -> None:
1674
+
1675
+ TOUR_STATE_FILE.parent.mkdir(parents=True, exist_ok=True)
1676
+
1677
+ TOUR_STATE_FILE.write_text(json.dumps(state, indent=2), encoding="utf-8")
1678
+
1679
+
1680
+
1681
+
1682
+
1683
+ def get_current_tour_step() -> TourStep | None:
1684
+
1685
+ state = load_tour_state()
1686
+
1687
+ idx = state.get("step", 0)
1688
+
1689
+ if idx >= len(FEATURE_TOUR):
1690
+
1691
+ return None
1692
+
1693
+ return FEATURE_TOUR[idx]
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+ def process_tour_command(cmd: str) -> tuple[bool, TourStep | None]:
1700
+
1701
+ """Process tour voice command."""
1702
+
1703
+ cmd = (cmd or "").lower().strip()
1704
+
1705
+ current = get_current_tour_step()
1706
+
1707
+ if not current:
1708
+
1709
+ return False, None
1710
+
1711
+
1712
+
1713
+ # Check completion hints
1714
+
1715
+ hints = ["next", "continue", "let's begin", "got it", "test it", "ok", "okay", "thank you", "finish", "done"]
1716
+
1717
+ if any(h in cmd for h in hints):
1718
+
1719
+ step = advance_tour()
1720
+
1721
+ return True, step
1722
+
1723
+
1724
+
1725
+ return False, current
1726
+
1727
+
1728
+
1729
+
1730
+
1731
+ def get_tour_progress() -> dict:
1732
+
1733
+ state = load_tour_state()
1734
+
1735
+ total = len(FEATURE_TOUR)
1736
+
1737
+ return {
1738
+
1739
+ "current": state.get("step", 0),
1740
+
1741
+ "total": total,
1742
+
1743
+ "percent": int((state.get("step", 0) / total) * 100),
1744
+
1745
+ "step_id": FEATURE_TOUR[state.get("step", 0)].step_id if state.get("step", 0) < total else "complete",
1746
+
1747
+ }
1748
+
webar/assets/ar-compositor-BESz3R9n.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{n as e}from"./ar-init-CwX7e95m.js";export{e as initVrStereoSplitScreen};
webar/assets/ar-init-CwX7e95m.js ADDED
The diff for this file is too large to render. See raw diff
 
webar/assets/index-CV0Nfhxs.js ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ar-init-CwX7e95m.js","./mediapipe-Ck-u_eH7.js","./physics-ZWohGOc1.js","./three-K6XMXseN.js","./rolldown-runtime-DK3Fl9T5.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./mediapipe-Ck-u_eH7.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=`jarvis_omega_session_credentials_v1`,n=`/xr/ar_config`;function r(){try{return localStorage.getItem(t)||``}catch{return``}}function i(e){try{localStorage.setItem(t,String(e||``).trim())}catch{}}async function a(e){try{return(await fetch(n,{headers:{Authorization:`Bearer ${e}`},cache:`no-store`})).status===200}catch{return!1}}async function o(){await e(()=>import(`./ar-init-CwX7e95m.js`),__vite__mapDeps([0,1,2,3,4]),import.meta.url)}function s(){let e=document.createElement(`div`);return e.id=`omega-access-gate`,e.innerHTML=`
3
+ <style>
4
+ #omega-access-gate {
5
+ position: fixed; inset: 0; z-index: 100000;
6
+ display: flex; align-items: center; justify-content: center;
7
+ background:
8
+ radial-gradient(120% 90% at 50% -10%, rgba(11,132,255,0.18), transparent 60%),
9
+ radial-gradient(80% 70% at 50% 120%, rgba(0,224,198,0.10), transparent 55%),
10
+ #05070b;
11
+ font-family: 'Inter', system-ui, sans-serif;
12
+ -webkit-tap-highlight-color: transparent;
13
+ animation: gateFade .5s ease both;
14
+ }
15
+ @keyframes gateFade { from { opacity: 0 } to { opacity: 1 } }
16
+ #omega-access-gate .card {
17
+ width: min(92vw, 380px);
18
+ padding: 34px 30px 28px;
19
+ border-radius: 22px;
20
+ background: linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
21
+ border: 1px solid rgba(120,180,255,0.18);
22
+ box-shadow: 0 30px 80px rgba(0,0,0,0.55), inset 0 1px 0 rgba(255,255,255,0.06);
23
+ backdrop-filter: blur(22px) saturate(140%);
24
+ text-align: center;
25
+ }
26
+ #omega-access-gate .ring {
27
+ width: 62px; height: 62px; margin: 0 auto 18px;
28
+ border-radius: 50%;
29
+ display: grid; place-items: center;
30
+ background: radial-gradient(circle at 50% 35%, rgba(11,132,255,0.35), rgba(11,132,255,0.06));
31
+ border: 1px solid rgba(120,180,255,0.4);
32
+ box-shadow: 0 0 30px rgba(11,132,255,0.35);
33
+ }
34
+ #omega-access-gate .ring svg { width: 26px; height: 26px; stroke: #cfe6ff; }
35
+ #omega-access-gate h1 {
36
+ margin: 0; font-size: 19px; font-weight: 700; letter-spacing: .3px; color: #eaf2ff;
37
+ }
38
+ #omega-access-gate p {
39
+ margin: 8px 0 22px; font-size: 12.5px; line-height: 1.5; color: rgba(200,216,240,0.62);
40
+ }
41
+ #omega-access-gate .field {
42
+ display: flex; gap: 8px; align-items: center;
43
+ background: rgba(0,0,0,0.35);
44
+ border: 1px solid rgba(120,180,255,0.22);
45
+ border-radius: 13px; padding: 4px 4px 4px 14px;
46
+ transition: border-color .2s, box-shadow .2s;
47
+ }
48
+ #omega-access-gate .field.focus { border-color: rgba(11,132,255,0.7); box-shadow: 0 0 0 3px rgba(11,132,255,0.18); }
49
+ #omega-access-gate .field.error { border-color: rgba(255,90,90,0.8); box-shadow: 0 0 0 3px rgba(255,90,90,0.16); }
50
+ #omega-access-gate input {
51
+ flex: 1; min-width: 0; border: 0; outline: 0; background: transparent;
52
+ color: #eaf2ff; font-size: 15px; letter-spacing: 1px; padding: 12px 0;
53
+ }
54
+ #omega-access-gate input::placeholder { color: rgba(200,216,240,0.35); letter-spacing: .3px; }
55
+ #omega-access-gate button {
56
+ border: 0; cursor: pointer;
57
+ width: 46px; height: 42px; border-radius: 10px;
58
+ background: linear-gradient(180deg, #1b8bff, #0a6be0);
59
+ color: #fff; font-size: 18px; display: grid; place-items: center;
60
+ transition: filter .15s, transform .1s;
61
+ }
62
+ #omega-access-gate button:hover { filter: brightness(1.08); }
63
+ #omega-access-gate button:active { transform: scale(0.94); }
64
+ #omega-access-gate button[disabled] { opacity: .55; cursor: default; }
65
+ #omega-access-gate .msg { margin-top: 14px; font-size: 12px; min-height: 16px; color: rgba(255,120,120,0.9); }
66
+ #omega-access-gate .foot { margin-top: 18px; font-size: 10.5px; color: rgba(200,216,240,0.32); letter-spacing: .4px; }
67
+ #omega-access-gate .spin { width: 16px; height: 16px; border: 2px solid rgba(255,255,255,0.35); border-top-color:#fff; border-radius:50%; animation: gateSpin .7s linear infinite; }
68
+ @keyframes gateSpin { to { transform: rotate(360deg) } }
69
+ </style>
70
+ <div class="card" role="dialog" aria-label="OMEGA access">
71
+ <div class="ring">
72
+ <svg viewBox="0 0 24 24" fill="none" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
73
+ <rect x="4.5" y="10.5" width="15" height="10" rx="2.2"></rect>
74
+ <path d="M8 10.5V7.5a4 4 0 0 1 8 0v3"></path>
75
+ <circle cx="12" cy="15.4" r="1.3"></circle>
76
+ </svg>
77
+ </div>
78
+ <h1>OMEGA Access</h1>
79
+ <p>Enter your cloud access key to unlock the AR system.</p>
80
+ <div class="field" id="gate-field">
81
+ <input id="gate-input" type="password" inputmode="text" autocomplete="current-password"
82
+ placeholder="Access key" aria-label="Access key" />
83
+ <button id="gate-go" aria-label="Unlock">→</button>
84
+ </div>
85
+ <div class="msg" id="gate-msg"></div>
86
+ <div class="foot">JARVIS · FRIDAY · OMEGA</div>
87
+ </div>`,e}async function c(e,{field:t,input:n,go:r,msg:s},c){let u=String(e||n?.value||``).trim();if(!u){l(t,s,`Enter your access key.`);return}if(r.innerHTML=`<span class="spin"></span>`,r.disabled=!0,!await a(u)){r.disabled=!1,r.textContent=`→`,l(t,s,`Incorrect access key.`),n&&(n.value=``,n.focus());return}i(u),s.style.color=`rgba(0,224,198,0.9)`,s.textContent=`Access granted.`,c.style.transition=`opacity .45s ease`,c.style.opacity=`0`,setTimeout(()=>c.remove(),460),await o()}function l(e,t,n){t.style.color=`rgba(255,120,120,0.9)`,t.textContent=n,e.classList.add(`error`),setTimeout(()=>e.classList.remove(`error`),900)}async function u(){let e=r();if(e&&await a(e)){await o();return}let t=s();document.body.appendChild(t);let n=t.querySelector(`#gate-field`),i=t.querySelector(`#gate-input`),l=t.querySelector(`#gate-go`),u=t.querySelector(`#gate-msg`),d={field:n,input:i,go:l,msg:u};i.addEventListener(`focus`,()=>n.classList.add(`focus`)),i.addEventListener(`blur`,()=>n.classList.remove(`focus`)),i.addEventListener(`input`,()=>{u.textContent=``}),i.addEventListener(`keydown`,e=>{e.key===`Enter`&&c(null,d,t)}),l.addEventListener(`click`,()=>c(null,d,t)),setTimeout(()=>i.focus(),300)}document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,u,{once:!0}):u();
webar/index.html CHANGED
@@ -119,11 +119,8 @@
119
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/hands/hands.js" crossorigin="anonymous"></script>
120
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/camera_utils/camera_utils.js" crossorigin="anonymous"></script>
121
  <script type="module" src="https://ajax.googleapis.com/ajax/libs/model-viewer/3.5.0/model-viewer.min.js" crossorigin="anonymous"></script>
122
- <script type="module" crossorigin src="./assets/index-CJ5sXKrr.js"></script>
123
- <link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-DK3Fl9T5.js">
124
  <link rel="modulepreload" crossorigin href="./assets/mediapipe-Ck-u_eH7.js">
125
- <link rel="modulepreload" crossorigin href="./assets/physics-ZWohGOc1.js">
126
- <link rel="modulepreload" crossorigin href="./assets/three-K6XMXseN.js">
127
  <link rel="stylesheet" crossorigin href="./assets/index-DSd7Ky4D.css">
128
  </head>
129
  <body>
@@ -212,7 +209,10 @@
212
  <div class="panel-resize-handle" aria-hidden="true"></div>
213
  </section>
214
  </template>
215
-
 
 
 
216
  <script>
217
  if ('serviceWorker' in navigator) {
218
  window.addEventListener('load', () => {
 
119
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/hands/hands.js" crossorigin="anonymous"></script>
120
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/camera_utils/camera_utils.js" crossorigin="anonymous"></script>
121
  <script type="module" src="https://ajax.googleapis.com/ajax/libs/model-viewer/3.5.0/model-viewer.min.js" crossorigin="anonymous"></script>
122
+ <script type="module" crossorigin src="./assets/index-CV0Nfhxs.js"></script>
 
123
  <link rel="modulepreload" crossorigin href="./assets/mediapipe-Ck-u_eH7.js">
 
 
124
  <link rel="stylesheet" crossorigin href="./assets/index-DSd7Ky4D.css">
125
  </head>
126
  <body>
 
209
  <div class="panel-resize-handle" aria-hidden="true"></div>
210
  </section>
211
  </template>
212
+
213
+ <!-- S4: access gate loads first; it imports ar-init.js only after the
214
+ cloud access key is validated server-side. Keeps the Space public
215
+ while locking the app behind a real backend-enforced password. -->
216
  <script>
217
  if ('serviceWorker' in navigator) {
218
  window.addEventListener('load', () => {