agentcrew-ai 0.8.13__py3-none-any.whl → 0.9.1__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 (55) hide show
  1. AgentCrew/__init__.py +1 -1
  2. AgentCrew/app.py +46 -634
  3. AgentCrew/main_docker.py +1 -30
  4. AgentCrew/modules/a2a/common/client/card_resolver.py +27 -8
  5. AgentCrew/modules/a2a/server.py +5 -0
  6. AgentCrew/modules/a2a/task_manager.py +1 -0
  7. AgentCrew/modules/agents/local_agent.py +2 -2
  8. AgentCrew/modules/chat/message/command_processor.py +33 -8
  9. AgentCrew/modules/chat/message/conversation.py +18 -1
  10. AgentCrew/modules/chat/message/handler.py +5 -1
  11. AgentCrew/modules/code_analysis/service.py +50 -7
  12. AgentCrew/modules/code_analysis/tool.py +9 -8
  13. AgentCrew/modules/console/completers.py +5 -1
  14. AgentCrew/modules/console/console_ui.py +23 -11
  15. AgentCrew/modules/console/conversation_browser/__init__.py +9 -0
  16. AgentCrew/modules/console/conversation_browser/browser.py +84 -0
  17. AgentCrew/modules/console/conversation_browser/browser_input_handler.py +279 -0
  18. AgentCrew/modules/console/{conversation_browser.py → conversation_browser/browser_ui.py} +249 -163
  19. AgentCrew/modules/console/conversation_handler.py +34 -1
  20. AgentCrew/modules/console/display_handlers.py +127 -7
  21. AgentCrew/modules/console/visual_mode/__init__.py +5 -0
  22. AgentCrew/modules/console/visual_mode/viewer.py +41 -0
  23. AgentCrew/modules/console/visual_mode/viewer_input_handler.py +315 -0
  24. AgentCrew/modules/console/visual_mode/viewer_ui.py +608 -0
  25. AgentCrew/modules/gui/components/command_handler.py +137 -29
  26. AgentCrew/modules/gui/components/menu_components.py +8 -7
  27. AgentCrew/modules/gui/themes/README.md +30 -14
  28. AgentCrew/modules/gui/themes/__init__.py +2 -1
  29. AgentCrew/modules/gui/themes/atom_light.yaml +1287 -0
  30. AgentCrew/modules/gui/themes/catppuccin.yaml +1276 -0
  31. AgentCrew/modules/gui/themes/dracula.yaml +1262 -0
  32. AgentCrew/modules/gui/themes/nord.yaml +1267 -0
  33. AgentCrew/modules/gui/themes/saigontech.yaml +1268 -0
  34. AgentCrew/modules/gui/themes/style_provider.py +78 -264
  35. AgentCrew/modules/gui/themes/theme_loader.py +379 -0
  36. AgentCrew/modules/gui/themes/unicorn.yaml +1276 -0
  37. AgentCrew/modules/gui/widgets/configs/global_settings.py +4 -4
  38. AgentCrew/modules/gui/widgets/history_sidebar.py +6 -1
  39. AgentCrew/modules/llm/constants.py +28 -9
  40. AgentCrew/modules/mcpclient/service.py +0 -1
  41. AgentCrew/modules/memory/base_service.py +13 -0
  42. AgentCrew/modules/memory/chroma_service.py +50 -0
  43. AgentCrew/setup.py +470 -0
  44. {agentcrew_ai-0.8.13.dist-info → agentcrew_ai-0.9.1.dist-info}/METADATA +1 -1
  45. {agentcrew_ai-0.8.13.dist-info → agentcrew_ai-0.9.1.dist-info}/RECORD +49 -40
  46. {agentcrew_ai-0.8.13.dist-info → agentcrew_ai-0.9.1.dist-info}/WHEEL +1 -1
  47. AgentCrew/modules/gui/themes/atom_light.py +0 -1365
  48. AgentCrew/modules/gui/themes/catppuccin.py +0 -1404
  49. AgentCrew/modules/gui/themes/dracula.py +0 -1372
  50. AgentCrew/modules/gui/themes/nord.py +0 -1365
  51. AgentCrew/modules/gui/themes/saigontech.py +0 -1359
  52. AgentCrew/modules/gui/themes/unicorn.py +0 -1372
  53. {agentcrew_ai-0.8.13.dist-info → agentcrew_ai-0.9.1.dist-info}/entry_points.txt +0 -0
  54. {agentcrew_ai-0.8.13.dist-info → agentcrew_ai-0.9.1.dist-info}/licenses/LICENSE +0 -0
  55. {agentcrew_ai-0.8.13.dist-info → agentcrew_ai-0.9.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,279 @@
1
+ """Conversation browser input handling."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Optional, Callable, List
6
+
7
+ from prompt_toolkit import PromptSession
8
+ from prompt_toolkit.key_binding import KeyBindings
9
+ from prompt_toolkit.keys import Keys
10
+
11
+ from loguru import logger
12
+
13
+ if TYPE_CHECKING:
14
+ from .browser_ui import ConversationBrowserUI
15
+
16
+
17
+ class ConversationBrowserInputHandler:
18
+ """Handles keyboard input for the conversation browser."""
19
+
20
+ def __init__(
21
+ self,
22
+ ui: ConversationBrowserUI,
23
+ on_select: Optional[Callable[[str], None]] = None,
24
+ on_cancel: Optional[Callable[[], None]] = None,
25
+ on_delete: Optional[Callable[[List[str]], bool]] = None,
26
+ ):
27
+ self._ui = ui
28
+ self._running = False
29
+ self._g_pressed = False
30
+ self._d_pressed = False
31
+ self._selected_id: Optional[str] = None
32
+ self._on_select = on_select
33
+ self._on_cancel = on_cancel
34
+ self._on_delete = on_delete
35
+
36
+ def _create_key_bindings(self) -> KeyBindings:
37
+ """Create and configure key bindings for the browser."""
38
+ kb = KeyBindings()
39
+
40
+ @kb.add(Keys.Up)
41
+ @kb.add("k")
42
+ def _(event):
43
+ if self._ui.search_mode:
44
+ return
45
+ self._g_pressed = False
46
+ self._d_pressed = False
47
+ if self._ui.handle_navigation("up"):
48
+ self._ui.render()
49
+
50
+ @kb.add(Keys.Down)
51
+ @kb.add("j")
52
+ def _(event):
53
+ if self._ui.search_mode:
54
+ return
55
+ self._g_pressed = False
56
+ self._d_pressed = False
57
+ if self._ui.handle_navigation("down"):
58
+ self._ui.render()
59
+
60
+ @kb.add(Keys.ControlP)
61
+ def _(event):
62
+ if self._ui.search_mode:
63
+ return
64
+ self._g_pressed = False
65
+ self._d_pressed = False
66
+ if self._ui.handle_navigation("up"):
67
+ self._ui.render()
68
+
69
+ @kb.add(Keys.ControlN)
70
+ def _(event):
71
+ if self._ui.search_mode:
72
+ return
73
+ self._g_pressed = False
74
+ self._d_pressed = False
75
+ if self._ui.handle_navigation("down"):
76
+ self._ui.render()
77
+
78
+ @kb.add("g")
79
+ def _(event):
80
+ if self._ui.search_mode:
81
+ self._ui.append_search_char("g")
82
+ self._ui.render()
83
+ return
84
+ self._d_pressed = False
85
+ if self._g_pressed:
86
+ self._g_pressed = False
87
+ if self._ui.handle_navigation("top"):
88
+ self._ui.render()
89
+ else:
90
+ self._g_pressed = True
91
+
92
+ @kb.add("G")
93
+ def _(event):
94
+ if self._ui.search_mode:
95
+ self._ui.append_search_char("G")
96
+ self._ui.render()
97
+ return
98
+ self._g_pressed = False
99
+ self._d_pressed = False
100
+ if self._ui.handle_navigation("bottom"):
101
+ self._ui.render()
102
+
103
+ @kb.add(Keys.ControlU)
104
+ @kb.add(Keys.PageUp)
105
+ def _(event):
106
+ if self._ui.search_mode:
107
+ return
108
+ self._g_pressed = False
109
+ self._d_pressed = False
110
+ if self._ui.handle_navigation("page_up"):
111
+ self._ui.render()
112
+
113
+ @kb.add(Keys.ControlD)
114
+ @kb.add(Keys.PageDown)
115
+ def _(event):
116
+ if self._ui.search_mode:
117
+ return
118
+ self._g_pressed = False
119
+ self._d_pressed = False
120
+ if self._ui.handle_navigation("page_down"):
121
+ self._ui.render()
122
+
123
+ @kb.add("v")
124
+ def _(event):
125
+ if self._ui.search_mode:
126
+ self._ui.append_search_char("v")
127
+ self._ui.render()
128
+ return
129
+ self._g_pressed = False
130
+ self._d_pressed = False
131
+ if self._ui.toggle_selection():
132
+ self._ui.render()
133
+
134
+ @kb.add("d")
135
+ def _(event):
136
+ if self._ui.search_mode:
137
+ self._ui.append_search_char("d")
138
+ self._ui.render()
139
+ return
140
+ self._g_pressed = False
141
+ if self._d_pressed:
142
+ self._d_pressed = False
143
+ self._handle_delete()
144
+ else:
145
+ self._d_pressed = True
146
+
147
+ @kb.add("/")
148
+ def _(event):
149
+ if self._ui.search_mode:
150
+ self._ui.append_search_char("/")
151
+ self._ui.render()
152
+ return
153
+ self._g_pressed = False
154
+ self._d_pressed = False
155
+ self._ui.start_search_mode()
156
+ self._ui.render()
157
+
158
+ @kb.add(Keys.Backspace)
159
+ def _(event):
160
+ if self._ui.search_mode:
161
+ self._ui.backspace_search()
162
+ self._ui.render()
163
+
164
+ @kb.add(Keys.Enter)
165
+ @kb.add("l")
166
+ def _(event):
167
+ self._g_pressed = False
168
+ self._d_pressed = False
169
+ if self._ui.search_mode:
170
+ self._ui.exit_search_mode(clear_filter=False)
171
+ self._ui.render()
172
+ return
173
+ self._selected_id = self._ui.get_selected_conversation_id()
174
+ event.app.exit()
175
+
176
+ @kb.add(Keys.Escape)
177
+ def _(event):
178
+ self._g_pressed = False
179
+ self._d_pressed = False
180
+ if self._ui.search_mode:
181
+ self._ui.exit_search_mode(clear_filter=True)
182
+ self._ui.render()
183
+ return
184
+ event.app.exit()
185
+
186
+ @kb.add("q")
187
+ def _(event):
188
+ if self._ui.search_mode:
189
+ self._ui.append_search_char("q")
190
+ self._ui.render()
191
+ return
192
+ self._g_pressed = False
193
+ self._d_pressed = False
194
+ event.app.exit()
195
+
196
+ @kb.add(Keys.ControlC)
197
+ def _(event):
198
+ self._g_pressed = False
199
+ self._d_pressed = False
200
+ if self._ui.search_mode:
201
+ self._ui.exit_search_mode(clear_filter=True)
202
+ self._ui.render()
203
+ return
204
+ event.app.exit()
205
+
206
+ @kb.add(Keys.Any)
207
+ def _(event):
208
+ if self._ui.search_mode:
209
+ char = event.data
210
+ if char and char.isprintable():
211
+ self._ui.append_search_char(char)
212
+ self._ui.render()
213
+ return
214
+ self._g_pressed = False
215
+ self._d_pressed = False
216
+
217
+ return kb
218
+
219
+ def _handle_delete(self):
220
+ """Handle delete action for selected or current conversation."""
221
+ if not self._ui.conversations:
222
+ return
223
+
224
+ if self._ui.selected_items:
225
+ indices_to_delete = list(self._ui.selected_items)
226
+ ids_to_delete = self._ui.get_selected_conversation_ids()
227
+ else:
228
+ indices_to_delete = [self._ui.selected_index]
229
+ current_id = self._ui.get_selected_conversation_id()
230
+ ids_to_delete = [current_id] if current_id else []
231
+
232
+ if not ids_to_delete:
233
+ return
234
+
235
+ if self._on_delete:
236
+ success = self._on_delete(ids_to_delete)
237
+ if success:
238
+ self._ui.remove_conversations(indices_to_delete)
239
+ self._ui.render()
240
+ else:
241
+ self._ui.remove_conversations(indices_to_delete)
242
+ self._ui.render()
243
+
244
+ def run(self) -> Optional[str]:
245
+ """Run the input handler loop.
246
+
247
+ Returns:
248
+ The ID of the selected conversation, or None if cancelled.
249
+ """
250
+ self._running = True
251
+ self._g_pressed = False
252
+ self._d_pressed = False
253
+ self._selected_id = None
254
+
255
+ self._ui.start_live()
256
+
257
+ kb = self._create_key_bindings()
258
+
259
+ try:
260
+ session = PromptSession(key_bindings=kb)
261
+ session.prompt("")
262
+ except (KeyboardInterrupt, EOFError):
263
+ pass
264
+ except Exception as e:
265
+ logger.error(f"Error in conversation browser input handler: {e}")
266
+ finally:
267
+ self._ui.stop_live()
268
+
269
+ self._running = False
270
+ return self._selected_id
271
+
272
+ @property
273
+ def is_running(self) -> bool:
274
+ """Check if the input handler is currently running."""
275
+ return self._running
276
+
277
+ def stop(self):
278
+ """Stop the input handler."""
279
+ self._running = False