superqode 0.1.5__py3-none-any.whl

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.
Files changed (288) hide show
  1. superqode/__init__.py +33 -0
  2. superqode/acp/__init__.py +23 -0
  3. superqode/acp/client.py +913 -0
  4. superqode/acp/permission_screen.py +457 -0
  5. superqode/acp/types.py +480 -0
  6. superqode/acp_discovery.py +856 -0
  7. superqode/agent/__init__.py +22 -0
  8. superqode/agent/edit_strategies.py +334 -0
  9. superqode/agent/loop.py +892 -0
  10. superqode/agent/qe_report_templates.py +39 -0
  11. superqode/agent/system_prompts.py +353 -0
  12. superqode/agent_output.py +721 -0
  13. superqode/agent_stream.py +953 -0
  14. superqode/agents/__init__.py +59 -0
  15. superqode/agents/acp_registry.py +305 -0
  16. superqode/agents/client.py +249 -0
  17. superqode/agents/data/augmentcode.com.toml +51 -0
  18. superqode/agents/data/cagent.dev.toml +51 -0
  19. superqode/agents/data/claude.com.toml +60 -0
  20. superqode/agents/data/codeassistant.dev.toml +51 -0
  21. superqode/agents/data/codex.openai.com.toml +57 -0
  22. superqode/agents/data/fastagent.ai.toml +66 -0
  23. superqode/agents/data/geminicli.com.toml +77 -0
  24. superqode/agents/data/goose.block.xyz.toml +54 -0
  25. superqode/agents/data/junie.jetbrains.com.toml +56 -0
  26. superqode/agents/data/kimi.moonshot.cn.toml +57 -0
  27. superqode/agents/data/llmlingagent.dev.toml +51 -0
  28. superqode/agents/data/molt.bot.toml +49 -0
  29. superqode/agents/data/opencode.ai.toml +60 -0
  30. superqode/agents/data/stakpak.dev.toml +51 -0
  31. superqode/agents/data/vtcode.dev.toml +51 -0
  32. superqode/agents/discovery.py +266 -0
  33. superqode/agents/messaging.py +160 -0
  34. superqode/agents/persona.py +166 -0
  35. superqode/agents/registry.py +421 -0
  36. superqode/agents/schema.py +72 -0
  37. superqode/agents/unified.py +367 -0
  38. superqode/app/__init__.py +111 -0
  39. superqode/app/constants.py +314 -0
  40. superqode/app/css.py +366 -0
  41. superqode/app/models.py +118 -0
  42. superqode/app/suggester.py +125 -0
  43. superqode/app/widgets.py +1591 -0
  44. superqode/app_enhanced.py +399 -0
  45. superqode/app_main.py +17187 -0
  46. superqode/approval.py +312 -0
  47. superqode/atomic.py +296 -0
  48. superqode/commands/__init__.py +1 -0
  49. superqode/commands/acp.py +965 -0
  50. superqode/commands/agents.py +180 -0
  51. superqode/commands/auth.py +278 -0
  52. superqode/commands/config.py +374 -0
  53. superqode/commands/init.py +826 -0
  54. superqode/commands/providers.py +819 -0
  55. superqode/commands/qe.py +1145 -0
  56. superqode/commands/roles.py +380 -0
  57. superqode/commands/serve.py +172 -0
  58. superqode/commands/suggestions.py +127 -0
  59. superqode/commands/superqe.py +460 -0
  60. superqode/config/__init__.py +51 -0
  61. superqode/config/loader.py +812 -0
  62. superqode/config/schema.py +498 -0
  63. superqode/core/__init__.py +111 -0
  64. superqode/core/roles.py +281 -0
  65. superqode/danger.py +386 -0
  66. superqode/data/superqode-template.yaml +1522 -0
  67. superqode/design_system.py +1080 -0
  68. superqode/dialogs/__init__.py +6 -0
  69. superqode/dialogs/base.py +39 -0
  70. superqode/dialogs/model.py +130 -0
  71. superqode/dialogs/provider.py +870 -0
  72. superqode/diff_view.py +919 -0
  73. superqode/enterprise.py +21 -0
  74. superqode/evaluation/__init__.py +25 -0
  75. superqode/evaluation/adapters.py +93 -0
  76. superqode/evaluation/behaviors.py +89 -0
  77. superqode/evaluation/engine.py +209 -0
  78. superqode/evaluation/scenarios.py +96 -0
  79. superqode/execution/__init__.py +36 -0
  80. superqode/execution/linter.py +538 -0
  81. superqode/execution/modes.py +347 -0
  82. superqode/execution/resolver.py +283 -0
  83. superqode/execution/runner.py +642 -0
  84. superqode/file_explorer.py +811 -0
  85. superqode/file_viewer.py +471 -0
  86. superqode/flash.py +183 -0
  87. superqode/guidance/__init__.py +58 -0
  88. superqode/guidance/config.py +203 -0
  89. superqode/guidance/prompts.py +71 -0
  90. superqode/harness/__init__.py +54 -0
  91. superqode/harness/accelerator.py +291 -0
  92. superqode/harness/config.py +319 -0
  93. superqode/harness/validator.py +147 -0
  94. superqode/history.py +279 -0
  95. superqode/integrations/superopt_runner.py +124 -0
  96. superqode/logging/__init__.py +49 -0
  97. superqode/logging/adapters.py +219 -0
  98. superqode/logging/formatter.py +923 -0
  99. superqode/logging/integration.py +341 -0
  100. superqode/logging/sinks.py +170 -0
  101. superqode/logging/unified_log.py +417 -0
  102. superqode/lsp/__init__.py +26 -0
  103. superqode/lsp/client.py +544 -0
  104. superqode/main.py +1069 -0
  105. superqode/mcp/__init__.py +89 -0
  106. superqode/mcp/auth_storage.py +380 -0
  107. superqode/mcp/client.py +1236 -0
  108. superqode/mcp/config.py +319 -0
  109. superqode/mcp/integration.py +337 -0
  110. superqode/mcp/oauth.py +436 -0
  111. superqode/mcp/oauth_callback.py +385 -0
  112. superqode/mcp/types.py +290 -0
  113. superqode/memory/__init__.py +31 -0
  114. superqode/memory/feedback.py +342 -0
  115. superqode/memory/store.py +522 -0
  116. superqode/notifications.py +369 -0
  117. superqode/optimization/__init__.py +5 -0
  118. superqode/optimization/config.py +33 -0
  119. superqode/permissions/__init__.py +25 -0
  120. superqode/permissions/rules.py +488 -0
  121. superqode/plan.py +323 -0
  122. superqode/providers/__init__.py +33 -0
  123. superqode/providers/gateway/__init__.py +165 -0
  124. superqode/providers/gateway/base.py +228 -0
  125. superqode/providers/gateway/litellm_gateway.py +1170 -0
  126. superqode/providers/gateway/openresponses_gateway.py +436 -0
  127. superqode/providers/health.py +297 -0
  128. superqode/providers/huggingface/__init__.py +74 -0
  129. superqode/providers/huggingface/downloader.py +472 -0
  130. superqode/providers/huggingface/endpoints.py +442 -0
  131. superqode/providers/huggingface/hub.py +531 -0
  132. superqode/providers/huggingface/inference.py +394 -0
  133. superqode/providers/huggingface/transformers_runner.py +516 -0
  134. superqode/providers/local/__init__.py +100 -0
  135. superqode/providers/local/base.py +438 -0
  136. superqode/providers/local/discovery.py +418 -0
  137. superqode/providers/local/lmstudio.py +256 -0
  138. superqode/providers/local/mlx.py +457 -0
  139. superqode/providers/local/ollama.py +486 -0
  140. superqode/providers/local/sglang.py +268 -0
  141. superqode/providers/local/tgi.py +260 -0
  142. superqode/providers/local/tool_support.py +477 -0
  143. superqode/providers/local/vllm.py +258 -0
  144. superqode/providers/manager.py +1338 -0
  145. superqode/providers/models.py +1016 -0
  146. superqode/providers/models_dev.py +578 -0
  147. superqode/providers/openresponses/__init__.py +87 -0
  148. superqode/providers/openresponses/converters/__init__.py +17 -0
  149. superqode/providers/openresponses/converters/messages.py +343 -0
  150. superqode/providers/openresponses/converters/tools.py +268 -0
  151. superqode/providers/openresponses/schema/__init__.py +56 -0
  152. superqode/providers/openresponses/schema/models.py +585 -0
  153. superqode/providers/openresponses/streaming/__init__.py +5 -0
  154. superqode/providers/openresponses/streaming/parser.py +338 -0
  155. superqode/providers/openresponses/tools/__init__.py +21 -0
  156. superqode/providers/openresponses/tools/apply_patch.py +352 -0
  157. superqode/providers/openresponses/tools/code_interpreter.py +290 -0
  158. superqode/providers/openresponses/tools/file_search.py +333 -0
  159. superqode/providers/openresponses/tools/mcp_adapter.py +252 -0
  160. superqode/providers/registry.py +716 -0
  161. superqode/providers/usage.py +332 -0
  162. superqode/pure_mode.py +384 -0
  163. superqode/qr/__init__.py +23 -0
  164. superqode/qr/dashboard.py +781 -0
  165. superqode/qr/generator.py +1018 -0
  166. superqode/qr/templates.py +135 -0
  167. superqode/safety/__init__.py +41 -0
  168. superqode/safety/sandbox.py +413 -0
  169. superqode/safety/warnings.py +256 -0
  170. superqode/server/__init__.py +33 -0
  171. superqode/server/lsp_server.py +775 -0
  172. superqode/server/web.py +250 -0
  173. superqode/session/__init__.py +25 -0
  174. superqode/session/persistence.py +580 -0
  175. superqode/session/sharing.py +477 -0
  176. superqode/session.py +475 -0
  177. superqode/sidebar.py +2991 -0
  178. superqode/stream_view.py +648 -0
  179. superqode/styles/__init__.py +3 -0
  180. superqode/superqe/__init__.py +184 -0
  181. superqode/superqe/acp_runner.py +1064 -0
  182. superqode/superqe/constitution/__init__.py +62 -0
  183. superqode/superqe/constitution/evaluator.py +308 -0
  184. superqode/superqe/constitution/loader.py +432 -0
  185. superqode/superqe/constitution/schema.py +250 -0
  186. superqode/superqe/events.py +591 -0
  187. superqode/superqe/frameworks/__init__.py +65 -0
  188. superqode/superqe/frameworks/base.py +234 -0
  189. superqode/superqe/frameworks/e2e.py +263 -0
  190. superqode/superqe/frameworks/executor.py +237 -0
  191. superqode/superqe/frameworks/javascript.py +409 -0
  192. superqode/superqe/frameworks/python.py +373 -0
  193. superqode/superqe/frameworks/registry.py +92 -0
  194. superqode/superqe/mcp_tools/__init__.py +47 -0
  195. superqode/superqe/mcp_tools/core_tools.py +418 -0
  196. superqode/superqe/mcp_tools/registry.py +230 -0
  197. superqode/superqe/mcp_tools/testing_tools.py +167 -0
  198. superqode/superqe/noise.py +89 -0
  199. superqode/superqe/orchestrator.py +778 -0
  200. superqode/superqe/roles.py +609 -0
  201. superqode/superqe/session.py +713 -0
  202. superqode/superqe/skills/__init__.py +57 -0
  203. superqode/superqe/skills/base.py +106 -0
  204. superqode/superqe/skills/core_skills.py +899 -0
  205. superqode/superqe/skills/registry.py +90 -0
  206. superqode/superqe/verifier.py +101 -0
  207. superqode/superqe_cli.py +76 -0
  208. superqode/tool_call.py +358 -0
  209. superqode/tools/__init__.py +93 -0
  210. superqode/tools/agent_tools.py +496 -0
  211. superqode/tools/base.py +324 -0
  212. superqode/tools/batch_tool.py +133 -0
  213. superqode/tools/diagnostics.py +311 -0
  214. superqode/tools/edit_tools.py +653 -0
  215. superqode/tools/enhanced_base.py +515 -0
  216. superqode/tools/file_tools.py +269 -0
  217. superqode/tools/file_tracking.py +45 -0
  218. superqode/tools/lsp_tools.py +610 -0
  219. superqode/tools/network_tools.py +350 -0
  220. superqode/tools/permissions.py +400 -0
  221. superqode/tools/question_tool.py +324 -0
  222. superqode/tools/search_tools.py +598 -0
  223. superqode/tools/shell_tools.py +259 -0
  224. superqode/tools/todo_tools.py +121 -0
  225. superqode/tools/validation.py +80 -0
  226. superqode/tools/web_tools.py +639 -0
  227. superqode/tui.py +1152 -0
  228. superqode/tui_integration.py +875 -0
  229. superqode/tui_widgets/__init__.py +27 -0
  230. superqode/tui_widgets/widgets/__init__.py +18 -0
  231. superqode/tui_widgets/widgets/progress.py +185 -0
  232. superqode/tui_widgets/widgets/tool_display.py +188 -0
  233. superqode/undo_manager.py +574 -0
  234. superqode/utils/__init__.py +5 -0
  235. superqode/utils/error_handling.py +323 -0
  236. superqode/utils/fuzzy.py +257 -0
  237. superqode/widgets/__init__.py +477 -0
  238. superqode/widgets/agent_collab.py +390 -0
  239. superqode/widgets/agent_store.py +936 -0
  240. superqode/widgets/agent_switcher.py +395 -0
  241. superqode/widgets/animation_manager.py +284 -0
  242. superqode/widgets/code_context.py +356 -0
  243. superqode/widgets/command_palette.py +412 -0
  244. superqode/widgets/connection_status.py +537 -0
  245. superqode/widgets/conversation_history.py +470 -0
  246. superqode/widgets/diff_indicator.py +155 -0
  247. superqode/widgets/enhanced_status_bar.py +385 -0
  248. superqode/widgets/enhanced_toast.py +476 -0
  249. superqode/widgets/file_browser.py +809 -0
  250. superqode/widgets/file_reference.py +585 -0
  251. superqode/widgets/issue_timeline.py +340 -0
  252. superqode/widgets/leader_key.py +264 -0
  253. superqode/widgets/mode_switcher.py +445 -0
  254. superqode/widgets/model_picker.py +234 -0
  255. superqode/widgets/permission_preview.py +1205 -0
  256. superqode/widgets/prompt.py +358 -0
  257. superqode/widgets/provider_connect.py +725 -0
  258. superqode/widgets/pty_shell.py +587 -0
  259. superqode/widgets/qe_dashboard.py +321 -0
  260. superqode/widgets/resizable_sidebar.py +377 -0
  261. superqode/widgets/response_changes.py +218 -0
  262. superqode/widgets/response_display.py +528 -0
  263. superqode/widgets/rich_tool_display.py +613 -0
  264. superqode/widgets/sidebar_panels.py +1180 -0
  265. superqode/widgets/slash_complete.py +356 -0
  266. superqode/widgets/split_view.py +612 -0
  267. superqode/widgets/status_bar.py +273 -0
  268. superqode/widgets/superqode_display.py +786 -0
  269. superqode/widgets/thinking_display.py +815 -0
  270. superqode/widgets/throbber.py +87 -0
  271. superqode/widgets/toast.py +206 -0
  272. superqode/widgets/unified_output.py +1073 -0
  273. superqode/workspace/__init__.py +75 -0
  274. superqode/workspace/artifacts.py +472 -0
  275. superqode/workspace/coordinator.py +353 -0
  276. superqode/workspace/diff_tracker.py +429 -0
  277. superqode/workspace/git_guard.py +373 -0
  278. superqode/workspace/git_snapshot.py +526 -0
  279. superqode/workspace/manager.py +750 -0
  280. superqode/workspace/snapshot.py +357 -0
  281. superqode/workspace/watcher.py +535 -0
  282. superqode/workspace/worktree.py +440 -0
  283. superqode-0.1.5.dist-info/METADATA +204 -0
  284. superqode-0.1.5.dist-info/RECORD +288 -0
  285. superqode-0.1.5.dist-info/WHEEL +5 -0
  286. superqode-0.1.5.dist-info/entry_points.txt +3 -0
  287. superqode-0.1.5.dist-info/licenses/LICENSE +648 -0
  288. superqode-0.1.5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,87 @@
1
+ """Loading throbber/spinner widget."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from textual.app import ComposeResult
6
+ from textual.containers import Horizontal
7
+ from textual.reactive import reactive
8
+ from textual.widget import Widget
9
+ from textual.widgets import Static, LoadingIndicator
10
+
11
+
12
+ class Throbber(Widget):
13
+ """
14
+ Loading overlay with spinner and message.
15
+
16
+ Used during async operations like agent connection.
17
+ """
18
+
19
+ DEFAULT_CSS = """
20
+ Throbber {
21
+ layer: overlay;
22
+ align: center middle;
23
+ width: auto;
24
+ height: auto;
25
+ background: $surface 90%;
26
+ border: round $primary;
27
+ padding: 1 2;
28
+ display: none;
29
+ }
30
+
31
+ Throbber.visible {
32
+ display: block;
33
+ }
34
+
35
+ Throbber > Horizontal {
36
+ width: auto;
37
+ height: auto;
38
+ }
39
+
40
+ Throbber LoadingIndicator {
41
+ width: 4;
42
+ height: 1;
43
+ color: $primary;
44
+ }
45
+
46
+ Throbber #throbber-text {
47
+ margin-left: 1;
48
+ color: $text;
49
+ }
50
+ """
51
+
52
+ # State
53
+ visible: reactive[bool] = reactive(False)
54
+ message: reactive[str] = reactive("Loading...")
55
+
56
+ def __init__(self, message: str = "Loading...", **kwargs) -> None:
57
+ super().__init__(**kwargs)
58
+ self.message = message
59
+
60
+ def compose(self) -> ComposeResult:
61
+ with Horizontal():
62
+ yield LoadingIndicator()
63
+ yield Static(self.message, id="throbber-text")
64
+
65
+ def show(self, message: str | None = None) -> None:
66
+ """Show the throbber with optional message."""
67
+ if message:
68
+ self.message = message
69
+ self.visible = True
70
+ self.add_class("visible")
71
+
72
+ def hide(self) -> None:
73
+ """Hide the throbber."""
74
+ self.visible = False
75
+ self.remove_class("visible")
76
+
77
+ def watch_message(self, message: str) -> None:
78
+ """React to message changes."""
79
+ try:
80
+ text_widget = self.query_one("#throbber-text", Static)
81
+ text_widget.update(message)
82
+ except Exception:
83
+ pass # Widget might not be mounted yet
84
+
85
+ def update_message(self, message: str) -> None:
86
+ """Update the loading message."""
87
+ self.message = message
@@ -0,0 +1,206 @@
1
+ """Toast notification widgets."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from enum import Enum
6
+ from typing import ClassVar
7
+
8
+ from textual.app import ComposeResult
9
+ from textual.containers import Vertical
10
+ from textual.message import Message
11
+ from textual.reactive import reactive
12
+ from textual.timer import Timer
13
+ from textual.widget import Widget
14
+ from textual.widgets import Static
15
+
16
+
17
+ class ToastType(Enum):
18
+ """Types of toast notifications."""
19
+
20
+ SUCCESS = "success"
21
+ ERROR = "error"
22
+ WARNING = "warning"
23
+ INFO = "info"
24
+
25
+
26
+ class Toast(Widget):
27
+ """
28
+ A single toast notification.
29
+
30
+ Auto-dismisses after a configurable duration.
31
+ """
32
+
33
+ DEFAULT_CSS = """
34
+ Toast {
35
+ width: auto;
36
+ max-width: 60;
37
+ height: auto;
38
+ padding: 0 2;
39
+ margin: 0 0 1 0;
40
+ background: $surface;
41
+ border: round $primary;
42
+ }
43
+
44
+ Toast.success {
45
+ border: round $success;
46
+ }
47
+
48
+ Toast.success .toast-icon {
49
+ color: $success;
50
+ }
51
+
52
+ Toast.error {
53
+ border: round $error;
54
+ }
55
+
56
+ Toast.error .toast-icon {
57
+ color: $error;
58
+ }
59
+
60
+ Toast.warning {
61
+ border: round $warning;
62
+ }
63
+
64
+ Toast.warning .toast-icon {
65
+ color: $warning;
66
+ }
67
+
68
+ Toast.info {
69
+ border: round $primary;
70
+ }
71
+
72
+ Toast.info .toast-icon {
73
+ color: $primary;
74
+ }
75
+
76
+ Toast .toast-content {
77
+ layout: horizontal;
78
+ height: auto;
79
+ }
80
+
81
+ Toast .toast-icon {
82
+ width: 3;
83
+ }
84
+
85
+ Toast .toast-message {
86
+ color: $text;
87
+ }
88
+ """
89
+
90
+ ICONS: ClassVar[dict[ToastType, str]] = {
91
+ ToastType.SUCCESS: "✓",
92
+ ToastType.ERROR: "✗",
93
+ ToastType.WARNING: "⚠",
94
+ ToastType.INFO: "ℹ",
95
+ }
96
+
97
+ class Dismissed(Message):
98
+ """Message sent when toast is dismissed."""
99
+
100
+ def __init__(self, toast: "Toast") -> None:
101
+ self.toast = toast
102
+ super().__init__()
103
+
104
+ def __init__(
105
+ self,
106
+ message: str,
107
+ toast_type: ToastType = ToastType.INFO,
108
+ duration: float = 3.0,
109
+ **kwargs,
110
+ ) -> None:
111
+ super().__init__(**kwargs)
112
+ self.message = message
113
+ self.toast_type = toast_type
114
+ self.duration = duration
115
+ self._timer: Timer | None = None
116
+
117
+ def compose(self) -> ComposeResult:
118
+ icon = self.ICONS.get(self.toast_type, "ℹ")
119
+ with Vertical(classes="toast-content"):
120
+ yield Static(f"{icon} {self.message}", classes="toast-message")
121
+
122
+ def on_mount(self) -> None:
123
+ """Start auto-dismiss timer on mount."""
124
+ self.add_class(self.toast_type.value)
125
+ if self.duration > 0:
126
+ self._timer = self.set_timer(self.duration, self._dismiss)
127
+
128
+ def _dismiss(self) -> None:
129
+ """Dismiss the toast."""
130
+ self.post_message(self.Dismissed(self))
131
+ self.remove()
132
+
133
+ def dismiss(self) -> None:
134
+ """Manually dismiss the toast."""
135
+ if self._timer:
136
+ self._timer.stop()
137
+ self._dismiss()
138
+
139
+ def on_click(self) -> None:
140
+ """Dismiss on click."""
141
+ self.dismiss()
142
+
143
+
144
+ class ToastContainer(Widget):
145
+ """
146
+ Container for toast notifications.
147
+
148
+ Manages multiple toasts with stacking.
149
+ """
150
+
151
+ DEFAULT_CSS = """
152
+ ToastContainer {
153
+ layer: notification;
154
+ dock: top;
155
+ align: center top;
156
+ height: auto;
157
+ width: auto;
158
+ margin-top: 1;
159
+ }
160
+ """
161
+
162
+ def __init__(self, **kwargs) -> None:
163
+ super().__init__(**kwargs)
164
+ self._toasts: list[Toast] = []
165
+
166
+ def compose(self) -> ComposeResult:
167
+ yield from [] # Start empty
168
+
169
+ def show_toast(
170
+ self,
171
+ message: str,
172
+ toast_type: ToastType = ToastType.INFO,
173
+ duration: float = 3.0,
174
+ ) -> Toast:
175
+ """Show a new toast notification."""
176
+ toast = Toast(message, toast_type, duration)
177
+ self._toasts.append(toast)
178
+ self.mount(toast)
179
+ return toast
180
+
181
+ def success(self, message: str, duration: float = 3.0) -> Toast:
182
+ """Show a success toast."""
183
+ return self.show_toast(message, ToastType.SUCCESS, duration)
184
+
185
+ def error(self, message: str, duration: float = 5.0) -> Toast:
186
+ """Show an error toast."""
187
+ return self.show_toast(message, ToastType.ERROR, duration)
188
+
189
+ def warning(self, message: str, duration: float = 4.0) -> Toast:
190
+ """Show a warning toast."""
191
+ return self.show_toast(message, ToastType.WARNING, duration)
192
+
193
+ def info(self, message: str, duration: float = 3.0) -> Toast:
194
+ """Show an info toast."""
195
+ return self.show_toast(message, ToastType.INFO, duration)
196
+
197
+ def on_toast_dismissed(self, event: Toast.Dismissed) -> None:
198
+ """Handle toast dismissal."""
199
+ if event.toast in self._toasts:
200
+ self._toasts.remove(event.toast)
201
+
202
+ def clear_all(self) -> None:
203
+ """Clear all toasts."""
204
+ for toast in list(self._toasts):
205
+ toast.dismiss()
206
+ self._toasts.clear()