cli-memory-os 0.1.8__tar.gz → 0.1.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cli_memory_os-0.1.8/cli_memory_os.egg-info → cli_memory_os-0.1.9}/PKG-INFO +1 -1
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/tui/app.py +84 -43
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9/cli_memory_os.egg-info}/PKG-INFO +1 -1
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/pyproject.toml +1 -1
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/tests/test_tui.py +14 -14
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/LICENSE +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/MANIFEST.in +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/README.md +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/__init__.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/__init__.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/ask.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/benchmark.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/config_cmd.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/doctor.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/export.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/import_cmd.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/init.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/logs.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/monitor.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/plugins.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/restart.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/start.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/status.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/stop.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/sync.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/version.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/commands/workspace.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/main.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/parser.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli/tui/__init__.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli_memory_os.egg-info/SOURCES.txt +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli_memory_os.egg-info/dependency_links.txt +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli_memory_os.egg-info/entry_points.txt +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli_memory_os.egg-info/requires.txt +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/cli_memory_os.egg-info/top_level.txt +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/connectors/__init__.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/connectors/base.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/connectors/github.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/connectors/gmail.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/connectors/notion.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/connectors/registry.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/core/__init__.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/core/chunker.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/core/context_builder.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/core/embedder.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/core/llm.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/core/vector_store.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/infrastructure/__init__.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/infrastructure/compose.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/infrastructure/config.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/infrastructure/docker.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/infrastructure/health.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/infrastructure/observability.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/infrastructure/workspace.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/models/__init__.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/models/memory.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/setup.cfg +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/storage/__init__.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/storage/db.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/storage/graph.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/storage/schema.sql +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/storage/tech_detector.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/tests/test_cli_integration.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/tests/test_commands_phase2.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/tests/test_compose_manager.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/tests/test_first_time_user_experience.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/tests/test_infrastructure_stabilization.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/tests/test_sync_ask_cli.py +0 -0
- {cli_memory_os-0.1.8 → cli_memory_os-0.1.9}/tests/test_v1_features.py +0 -0
|
@@ -159,16 +159,16 @@ class Sidebar(Static):
|
|
|
159
159
|
f"Gmail: {self.gmail_status}\n"
|
|
160
160
|
f"Notion: {self.notion_status}\n\n"
|
|
161
161
|
f"[bold cyan]⌨️ Shortcuts[/bold cyan]\n"
|
|
162
|
-
f"[cyan]
|
|
163
|
-
f"[cyan]
|
|
164
|
-
f"[cyan]
|
|
165
|
-
f"[cyan]
|
|
166
|
-
f"[cyan]
|
|
167
|
-
f"[cyan]
|
|
168
|
-
f"[cyan]
|
|
169
|
-
f"[cyan]
|
|
162
|
+
f"[cyan]F1[/cyan] : Chat\n"
|
|
163
|
+
f"[cyan]F2[/cyan] : Sync\n"
|
|
164
|
+
f"[cyan]F3[/cyan] : Doctor\n"
|
|
165
|
+
f"[cyan]F4[/cyan] : Graph\n"
|
|
166
|
+
f"[cyan]F5[/cyan] : Search\n"
|
|
167
|
+
f"[cyan]F6[/cyan] : Monitor\n"
|
|
168
|
+
f"[cyan]F7[/cyan] : Settings\n"
|
|
169
|
+
f"[cyan]F10[/cyan]: Quit"
|
|
170
170
|
)
|
|
171
|
-
self.update(Panel(content, title="Memory-OS", border_style="
|
|
171
|
+
self.update(Panel(content, title="Memory-OS", border_style="#1F2937"))
|
|
172
172
|
|
|
173
173
|
|
|
174
174
|
class ChatPanel(Static):
|
|
@@ -177,8 +177,21 @@ class ChatPanel(Static):
|
|
|
177
177
|
def compose(self) -> ComposeResult:
|
|
178
178
|
with Vertical(id="chat_container"):
|
|
179
179
|
with VerticalScroll(id="chat_history_scroll"):
|
|
180
|
+
welcome_md = (
|
|
181
|
+
"```\n"
|
|
182
|
+
" __ __ ____ ____\n"
|
|
183
|
+
"| \\/ | ___ _ __ ___ ___ _ __ _ _ / ___| / ___|\n"
|
|
184
|
+
"| |\\/| |/ _ \\ '_ ` _ \\ / _ \\| '__| | | | \\___ \\| |\n"
|
|
185
|
+
"| | | | __/ | | | | | (_) | | | |_| | ___) | |___\n"
|
|
186
|
+
"|_| |_|\\___|_| |_| |_|\\___/|_| \\__, | |____/ \\____|\n"
|
|
187
|
+
" |___/\n"
|
|
188
|
+
"```\n"
|
|
189
|
+
"**Grounded Personal Knowledge Operating System**\n\n"
|
|
190
|
+
"Ask questions grounded against your connected workspace: repositories, documentation files, and synced emails.\n\n"
|
|
191
|
+
"💡 *Tip: Try asking: 'tell me about my projects' or 'what repositories use Python?'*"
|
|
192
|
+
)
|
|
180
193
|
yield Static(
|
|
181
|
-
RichMarkdown(
|
|
194
|
+
RichMarkdown(welcome_md),
|
|
182
195
|
id="welcome_message"
|
|
183
196
|
)
|
|
184
197
|
with Horizontal(id="input_bar"):
|
|
@@ -212,14 +225,15 @@ class ChatPanel(Static):
|
|
|
212
225
|
except Exception:
|
|
213
226
|
pass
|
|
214
227
|
|
|
215
|
-
# Append User Message
|
|
228
|
+
# Append User Message
|
|
216
229
|
history_scroll = self.query_one("#chat_history_scroll")
|
|
230
|
+
user_markup = f"[bold green]● You[/bold green]\n\n{user_text}"
|
|
217
231
|
history_scroll.mount(
|
|
218
|
-
Static(
|
|
232
|
+
Static(user_markup, classes="chat_msg_user")
|
|
219
233
|
)
|
|
220
234
|
|
|
221
|
-
# Append Assistant Loading/Streaming Message
|
|
222
|
-
agent_msg = Static(
|
|
235
|
+
# Append Assistant Loading/Streaming Message
|
|
236
|
+
agent_msg = Static("[bold cyan]● Memory-OS[/bold cyan]\n\n[italic dim]Thinking...[/italic dim]", classes="chat_msg_agent")
|
|
223
237
|
history_scroll.mount(agent_msg)
|
|
224
238
|
self.scroll_to_bottom()
|
|
225
239
|
|
|
@@ -240,7 +254,7 @@ class ChatPanel(Static):
|
|
|
240
254
|
try:
|
|
241
255
|
gen = await loop.run_in_executor(executor, get_generator)
|
|
242
256
|
except Exception as e:
|
|
243
|
-
response_widget.update(
|
|
257
|
+
response_widget.update(f"[bold red]● Error[/bold red]\n\n{e}")
|
|
244
258
|
self.enable_input()
|
|
245
259
|
return
|
|
246
260
|
|
|
@@ -255,14 +269,14 @@ class ChatPanel(Static):
|
|
|
255
269
|
except StopIteration:
|
|
256
270
|
break
|
|
257
271
|
except Exception as e:
|
|
258
|
-
response_widget.update(
|
|
272
|
+
response_widget.update(f"[bold red]● Error[/bold red]\n\n{e}")
|
|
259
273
|
break
|
|
260
274
|
|
|
261
275
|
if item["type"] == "diagnostics":
|
|
262
276
|
query_class = item["data"].get("query_class", "Unknown")
|
|
263
277
|
elif item["type"] == "token":
|
|
264
278
|
answer_text += item["content"]
|
|
265
|
-
response_widget.update(
|
|
279
|
+
response_widget.update(f"[bold cyan]● Memory-OS ({query_class})[/bold cyan]\n\n{answer_text}")
|
|
266
280
|
self.scroll_to_bottom()
|
|
267
281
|
elif item["type"] == "done":
|
|
268
282
|
sources = item["sources"]
|
|
@@ -280,7 +294,7 @@ class ChatPanel(Static):
|
|
|
280
294
|
metadata.append(f"**Confidence**: {confidence:.1f}")
|
|
281
295
|
final_md += "\n\n---\n" + "\n".join(metadata)
|
|
282
296
|
|
|
283
|
-
response_widget.update(
|
|
297
|
+
response_widget.update(RichMarkdown(f"### ● Memory-OS ({query_class})\n\n{final_md}"))
|
|
284
298
|
self.scroll_to_bottom()
|
|
285
299
|
|
|
286
300
|
self.enable_input()
|
|
@@ -354,7 +368,7 @@ class DoctorPanel(Static):
|
|
|
354
368
|
report.append("=" * 45)
|
|
355
369
|
report.append(f"Summary: [bold]{healthy_count}/{len(results)}[/bold] services are functional.")
|
|
356
370
|
|
|
357
|
-
results_static.update(Panel("\n".join(report), border_style="
|
|
371
|
+
results_static.update(Panel("\n".join(report), border_style="#1F2937"))
|
|
358
372
|
btn.disabled = False
|
|
359
373
|
|
|
360
374
|
|
|
@@ -453,7 +467,7 @@ class SyncPanel(Static):
|
|
|
453
467
|
return mystdout.getvalue()
|
|
454
468
|
|
|
455
469
|
output = await loop.run_in_executor(executor, run_sync_redirected)
|
|
456
|
-
log_widget.update(Panel(output, title="Sync Log Output", border_style="
|
|
470
|
+
log_widget.update(Panel(output, title="Sync Log Output", border_style="#1F2937"))
|
|
457
471
|
|
|
458
472
|
btn_all.disabled = False
|
|
459
473
|
btn_rebuild.disabled = False
|
|
@@ -530,7 +544,7 @@ class GraphPanel(Static):
|
|
|
530
544
|
for r_name, lang in repos:
|
|
531
545
|
stats_text += f" - [white]{r_name}[/white] : {lang or 'Unknown'}\n"
|
|
532
546
|
|
|
533
|
-
self.query_one("#graph_stats", Static).update(Panel(stats_text, border_style="
|
|
547
|
+
self.query_one("#graph_stats", Static).update(Panel(stats_text, border_style="#1F2937"))
|
|
534
548
|
|
|
535
549
|
|
|
536
550
|
class SearchPanel(Static):
|
|
@@ -640,7 +654,7 @@ class MonitorPanel(Static):
|
|
|
640
654
|
if l_times:
|
|
641
655
|
stats_text += f" - Last Groq response: {l_times[-1]:.2f}s\n"
|
|
642
656
|
|
|
643
|
-
self.query_one("#monitor_stats", Static).update(Panel(stats_text, border_style="
|
|
657
|
+
self.query_one("#monitor_stats", Static).update(Panel(stats_text, border_style="#1F2937"))
|
|
644
658
|
|
|
645
659
|
|
|
646
660
|
class SettingsPanel(Static):
|
|
@@ -668,7 +682,7 @@ class SettingsPanel(Static):
|
|
|
668
682
|
f"Groq Model: {cfg.get('groq', {}).get('model', 'llama-3.3-70b-versatile')}\n"
|
|
669
683
|
f"Embedding Model: {cfg.get('embeddings', {}).get('model', 'all-MiniLM-L6-v2')}\n"
|
|
670
684
|
)
|
|
671
|
-
self.query_one("#settings_details", Static).update(Panel(details, border_style="
|
|
685
|
+
self.query_one("#settings_details", Static).update(Panel(details, border_style="#1F2937"))
|
|
672
686
|
|
|
673
687
|
|
|
674
688
|
class MemoryOSTUIApp(App):
|
|
@@ -677,7 +691,7 @@ class MemoryOSTUIApp(App):
|
|
|
677
691
|
TITLE = "Memory-OS Terminal UI"
|
|
678
692
|
CSS = """
|
|
679
693
|
Screen {
|
|
680
|
-
background: #
|
|
694
|
+
background: #0B0F19;
|
|
681
695
|
}
|
|
682
696
|
|
|
683
697
|
#main_layout {
|
|
@@ -687,8 +701,8 @@ class MemoryOSTUIApp(App):
|
|
|
687
701
|
Sidebar {
|
|
688
702
|
width: 35;
|
|
689
703
|
height: 100%;
|
|
690
|
-
background: #
|
|
691
|
-
border-right: solid
|
|
704
|
+
background: #111622;
|
|
705
|
+
border-right: solid #1F2937;
|
|
692
706
|
}
|
|
693
707
|
|
|
694
708
|
ContentSwitcher {
|
|
@@ -703,19 +717,24 @@ class MemoryOSTUIApp(App):
|
|
|
703
717
|
|
|
704
718
|
#chat_history_scroll {
|
|
705
719
|
height: 1fr;
|
|
706
|
-
border: solid
|
|
720
|
+
border: solid #1F2937;
|
|
707
721
|
margin-bottom: 1;
|
|
708
722
|
padding: 1 2;
|
|
723
|
+
background: #0B0F19;
|
|
709
724
|
}
|
|
710
725
|
|
|
711
726
|
.chat_msg_user {
|
|
712
727
|
margin: 1 0;
|
|
713
|
-
|
|
728
|
+
background: #161B22;
|
|
729
|
+
border-left: solid #10B981;
|
|
730
|
+
padding: 1 2;
|
|
714
731
|
}
|
|
715
732
|
|
|
716
733
|
.chat_msg_agent {
|
|
717
734
|
margin: 1 0;
|
|
718
|
-
|
|
735
|
+
background: #111622;
|
|
736
|
+
border-left: solid #3B82F6;
|
|
737
|
+
padding: 1 2;
|
|
719
738
|
}
|
|
720
739
|
|
|
721
740
|
#input_bar {
|
|
@@ -725,14 +744,21 @@ class MemoryOSTUIApp(App):
|
|
|
725
744
|
|
|
726
745
|
#chat_input {
|
|
727
746
|
width: 1fr;
|
|
728
|
-
background: #
|
|
729
|
-
border: solid
|
|
747
|
+
background: #161B22;
|
|
748
|
+
border: solid #1F2937;
|
|
730
749
|
color: white;
|
|
731
750
|
}
|
|
732
751
|
|
|
733
752
|
#chat_send_btn {
|
|
734
753
|
width: 12;
|
|
735
754
|
margin-left: 1;
|
|
755
|
+
background: #1F2937;
|
|
756
|
+
color: white;
|
|
757
|
+
border: none;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
#chat_send_btn:hover {
|
|
761
|
+
background: #3B82F6;
|
|
736
762
|
}
|
|
737
763
|
|
|
738
764
|
#search_bar {
|
|
@@ -742,25 +768,40 @@ class MemoryOSTUIApp(App):
|
|
|
742
768
|
|
|
743
769
|
#search_query_input {
|
|
744
770
|
width: 1fr;
|
|
745
|
-
background: #
|
|
746
|
-
border: solid
|
|
771
|
+
background: #161B22;
|
|
772
|
+
border: solid #1F2937;
|
|
747
773
|
color: white;
|
|
748
774
|
}
|
|
749
775
|
|
|
750
776
|
#search_run_btn {
|
|
751
777
|
width: 12;
|
|
752
778
|
margin-left: 1;
|
|
779
|
+
background: #1F2937;
|
|
780
|
+
color: white;
|
|
781
|
+
border: none;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
#search_run_btn:hover {
|
|
785
|
+
background: #3B82F6;
|
|
753
786
|
}
|
|
754
787
|
|
|
755
788
|
#doctor_results_scroll, #sync_results_scroll, #search_results_scroll {
|
|
756
789
|
height: 1fr;
|
|
757
|
-
border: solid
|
|
790
|
+
border: solid #1F2937;
|
|
758
791
|
margin-top: 1;
|
|
759
792
|
padding: 1 2;
|
|
793
|
+
background: #0B0F19;
|
|
760
794
|
}
|
|
761
795
|
|
|
762
796
|
Button {
|
|
763
797
|
min-width: 15;
|
|
798
|
+
background: #1F2937;
|
|
799
|
+
color: white;
|
|
800
|
+
border: none;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
Button:hover {
|
|
804
|
+
background: #3B82F6;
|
|
764
805
|
}
|
|
765
806
|
|
|
766
807
|
Label {
|
|
@@ -769,15 +810,15 @@ class MemoryOSTUIApp(App):
|
|
|
769
810
|
"""
|
|
770
811
|
|
|
771
812
|
BINDINGS = [
|
|
772
|
-
Binding("ctrl+b", "toggle_sidebar", "
|
|
773
|
-
Binding("
|
|
774
|
-
Binding("
|
|
775
|
-
Binding("
|
|
776
|
-
Binding("
|
|
777
|
-
Binding("
|
|
778
|
-
Binding("
|
|
779
|
-
Binding("
|
|
780
|
-
Binding("
|
|
813
|
+
Binding("ctrl+b", "toggle_sidebar", "Sidebar"),
|
|
814
|
+
Binding("f1", "switch_view('chat')", "Chat"),
|
|
815
|
+
Binding("f2", "switch_view('sync')", "Sync"),
|
|
816
|
+
Binding("f3", "switch_view('doctor')", "Doctor"),
|
|
817
|
+
Binding("f4", "switch_view('graph')", "Graph"),
|
|
818
|
+
Binding("f5", "switch_view('search')", "Search"),
|
|
819
|
+
Binding("f6", "switch_view('monitor')", "Monitor"),
|
|
820
|
+
Binding("f7", "switch_view('settings')", "Settings"),
|
|
821
|
+
Binding("f10", "quit", "Quit"),
|
|
781
822
|
]
|
|
782
823
|
|
|
783
824
|
sidebar_visible = reactive(True)
|
|
@@ -47,39 +47,39 @@ async def test_tui_view_switching():
|
|
|
47
47
|
# Unfocus input before pressing hotkeys
|
|
48
48
|
app.set_focus(None)
|
|
49
49
|
|
|
50
|
-
# Press '
|
|
50
|
+
# Press 'f2' to go to Sync
|
|
51
51
|
app.set_focus(None)
|
|
52
|
-
await pilot.press("
|
|
52
|
+
await pilot.press("f2")
|
|
53
53
|
assert switcher.current == "sync"
|
|
54
54
|
|
|
55
|
-
# Press '
|
|
55
|
+
# Press 'f3' to go to Doctor
|
|
56
56
|
app.set_focus(None)
|
|
57
|
-
await pilot.press("
|
|
57
|
+
await pilot.press("f3")
|
|
58
58
|
assert switcher.current == "doctor"
|
|
59
59
|
|
|
60
|
-
# Press '
|
|
60
|
+
# Press 'f4' to go to Graph
|
|
61
61
|
app.set_focus(None)
|
|
62
|
-
await pilot.press("
|
|
62
|
+
await pilot.press("f4")
|
|
63
63
|
assert switcher.current == "graph"
|
|
64
64
|
|
|
65
|
-
# Press '
|
|
65
|
+
# Press 'f5' to go to Search
|
|
66
66
|
app.set_focus(None)
|
|
67
|
-
await pilot.press("
|
|
67
|
+
await pilot.press("f5")
|
|
68
68
|
assert switcher.current == "search"
|
|
69
69
|
|
|
70
|
-
# Press '
|
|
70
|
+
# Press 'f6' to go to Monitor
|
|
71
71
|
app.set_focus(None)
|
|
72
|
-
await pilot.press("
|
|
72
|
+
await pilot.press("f6")
|
|
73
73
|
assert switcher.current == "monitor"
|
|
74
74
|
|
|
75
|
-
# Press '
|
|
75
|
+
# Press 'f7' to go to Settings
|
|
76
76
|
app.set_focus(None)
|
|
77
|
-
await pilot.press("
|
|
77
|
+
await pilot.press("f7")
|
|
78
78
|
assert switcher.current == "settings"
|
|
79
79
|
|
|
80
|
-
# Press '
|
|
80
|
+
# Press 'f1' to return to Chat
|
|
81
81
|
app.set_focus(None)
|
|
82
|
-
await pilot.press("
|
|
82
|
+
await pilot.press("f1")
|
|
83
83
|
assert switcher.current == "chat"
|
|
84
84
|
|
|
85
85
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|