sa-assistant 0.2.3__tar.gz → 0.2.5__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.
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/PKG-INFO +1 -1
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/pyproject.toml +1 -1
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/sa_assistant.egg-info/PKG-INFO +1 -1
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/tui/app.py +12 -4
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/README.md +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/setup.cfg +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agents/__init__.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agents/orchestrator.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agents/specialists.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agentskills/__init__.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agentskills/discovery.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agentskills/errors.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agentskills/models.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agentskills/parser.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agentskills/prompt.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/agentskills/tool.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/cli/__init__.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/cli/callback.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/cli/components.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/cli/console.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/cli/mdstream.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/mcp_client/client.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/model/__init__.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/model/load.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/prompts/__init__.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/prompts/system_prompts.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/sa_assistant.egg-info/SOURCES.txt +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/sa_assistant.egg-info/dependency_links.txt +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/sa_assistant.egg-info/entry_points.txt +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/sa_assistant.egg-info/requires.txt +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/sa_assistant.egg-info/top_level.txt +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/tui/__init__.py +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/src/tui/styles.tcss +0 -0
- {sa_assistant-0.2.3 → sa_assistant-0.2.5}/test/test_main.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sa-assistant"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.5"
|
|
8
8
|
requires-python = ">=3.10"
|
|
9
9
|
description = "SA Assistant - AWS Solutions Architect Professional Agent with Multi-Agent Architecture"
|
|
10
10
|
readme = "README.md"
|
|
@@ -26,7 +26,7 @@ from agentskills import discover_skills, generate_skills_prompt, create_skill_to
|
|
|
26
26
|
|
|
27
27
|
CSS_PATH = Path(__file__).parent / "styles.tcss"
|
|
28
28
|
SKILLS_DIR = Path(__file__).parent.parent / "skills"
|
|
29
|
-
VERSION = "0.2.
|
|
29
|
+
VERSION = "0.2.5"
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class SessionHeader(Static):
|
|
@@ -154,6 +154,7 @@ class MessagePanel(Vertical):
|
|
|
154
154
|
|
|
155
155
|
def update_content(self, text: str) -> None:
|
|
156
156
|
"""Replace all content."""
|
|
157
|
+
self._content = text # Store content for later if _log not ready
|
|
157
158
|
if self._log:
|
|
158
159
|
self._log.clear()
|
|
159
160
|
self._log.write(text)
|
|
@@ -263,6 +264,7 @@ class SAAssistantApp(App):
|
|
|
263
264
|
self._agent: Optional[Agent] = None
|
|
264
265
|
self._current_panel: Optional[MessagePanel] = None
|
|
265
266
|
self._response_buffer = ""
|
|
267
|
+
self._seen_tool_ids: set[str] = set() # Track tool_use IDs to prevent duplicates
|
|
266
268
|
self._init_agent()
|
|
267
269
|
|
|
268
270
|
def _init_agent(self) -> None:
|
|
@@ -306,8 +308,12 @@ class SAAssistantApp(App):
|
|
|
306
308
|
if "current_tool_use" in kwargs:
|
|
307
309
|
tool_use = kwargs["current_tool_use"]
|
|
308
310
|
if isinstance(tool_use, dict):
|
|
311
|
+
tool_id = tool_use.get("toolUseId", "") # Fixed: was "id", should be "toolUseId"
|
|
309
312
|
tool_name = tool_use.get("name", "tool")
|
|
310
|
-
|
|
313
|
+
# Only add panel once per unique tool_use ID
|
|
314
|
+
if tool_id and tool_id not in self._seen_tool_ids:
|
|
315
|
+
self._seen_tool_ids.add(tool_id)
|
|
316
|
+
self.call_from_thread(self._add_tool_panel, tool_name)
|
|
311
317
|
|
|
312
318
|
def _add_tool_panel(self, tool_name: str) -> None:
|
|
313
319
|
"""Add a tool execution panel to the chat."""
|
|
@@ -318,9 +324,10 @@ class SAAssistantApp(App):
|
|
|
318
324
|
"""Compose the UI layout."""
|
|
319
325
|
yield SessionHeader()
|
|
320
326
|
yield ChatContainer()
|
|
321
|
-
yield
|
|
327
|
+
# Bottom elements: yield in order from bottom to top
|
|
328
|
+
yield HotkeyBar() # Very bottom
|
|
322
329
|
yield Input(placeholder="Type your message... (Enter to send)", id="input-field")
|
|
323
|
-
yield
|
|
330
|
+
yield AgentIndicator() # Above input
|
|
324
331
|
|
|
325
332
|
def on_mount(self) -> None:
|
|
326
333
|
"""Focus the input field on mount."""
|
|
@@ -347,6 +354,7 @@ class SAAssistantApp(App):
|
|
|
347
354
|
# Prepare for assistant response
|
|
348
355
|
self._current_panel = chat.add_assistant_message()
|
|
349
356
|
self._response_buffer = ""
|
|
357
|
+
self._seen_tool_ids.clear() # Reset for new conversation turn
|
|
350
358
|
|
|
351
359
|
# Run agent in background thread
|
|
352
360
|
self.run_agent(user_input)
|
|
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
|