abstractassistant 0.3.0__tar.gz → 0.3.1__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.
Files changed (60) hide show
  1. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/PKG-INFO +2 -2
  2. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/app.py +5 -0
  3. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/qt_bubble.py +89 -109
  4. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/utils/icon_generator.py +6 -4
  5. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant.egg-info/PKG-INFO +2 -2
  6. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant.egg-info/requires.txt +1 -1
  7. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/pyproject.toml +2 -2
  8. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/LICENSE +0 -0
  9. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/README.md +0 -0
  10. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/__init__.py +0 -0
  11. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/cli.py +0 -0
  12. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/config.py +0 -0
  13. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/core/__init__.py +0 -0
  14. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/core/llm_manager.py +0 -0
  15. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/core/tts_manager.py +0 -0
  16. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/create_app_bundle.py +0 -0
  17. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/__init__.py +0 -0
  18. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/chat_bubble.py +0 -0
  19. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/history_dialog.py +0 -0
  20. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/provider_manager.py +0 -0
  21. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/toast_manager.py +0 -0
  22. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/toast_window.py +0 -0
  23. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/tts_state_manager.py +0 -0
  24. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/ui/ui_styles.py +0 -0
  25. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/utils/__init__.py +0 -0
  26. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/utils/markdown_renderer.py +0 -0
  27. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant/web_server.py +0 -0
  28. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant.egg-info/SOURCES.txt +0 -0
  29. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant.egg-info/dependency_links.txt +0 -0
  30. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant.egg-info/entry_points.txt +0 -0
  31. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/abstractassistant.egg-info/top_level.txt +0 -0
  32. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/setup.cfg +0 -0
  33. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/setup_macos_app.py +0 -0
  34. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_abstractcore.py +0 -0
  35. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_app.py +0 -0
  36. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_bubble.py +0 -0
  37. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_bubble_manual.py +0 -0
  38. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_complete_voice_integration.py +0 -0
  39. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_complete_working.py +0 -0
  40. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_corrected_logic.py +0 -0
  41. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_double_click_fix.py +0 -0
  42. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_final_app_demo.py +0 -0
  43. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_final_verification.py +0 -0
  44. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_final_voice_mode.py +0 -0
  45. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_fixed_app.py +0 -0
  46. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_fixed_integration.py +0 -0
  47. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_full_voice_mode.py +0 -0
  48. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_integration.py +0 -0
  49. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_qt_bubble.py +0 -0
  50. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_qt_threading.py +0 -0
  51. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_real_application.py +0 -0
  52. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_reason_values.py +0 -0
  53. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_safe_startup.py +0 -0
  54. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_safe_voice_controls.py +0 -0
  55. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_simple.py +0 -0
  56. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_system_tray.py +0 -0
  57. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_timestamp_clicks.py +0 -0
  58. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_voice_double_click.py +0 -0
  59. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_voice_features.py +0 -0
  60. {abstractassistant-0.3.0 → abstractassistant-0.3.1}/tests/test_voice_timing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractassistant
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: A sleek (macOS) system tray application providing instant access to LLMs
5
5
  Author-email: Laurent-Philippe Albou <contact@abstractcore.ai>
6
6
  License-Expression: MIT
@@ -28,7 +28,7 @@ Requires-Dist: PyQt5>=5.15.0
28
28
  Requires-Dist: markdown>=3.5.0
29
29
  Requires-Dist: pygments>=2.16.0
30
30
  Requires-Dist: pymdown-extensions>=10.0
31
- Requires-Dist: abstractvoice>=0.5.0
31
+ Requires-Dist: abstractvoice>=0.5.1
32
32
  Requires-Dist: pyperclip>=1.8.2
33
33
  Requires-Dist: plyer>=2.1.0
34
34
  Requires-Dist: tomli>=2.0.0; python_version < "3.11"
@@ -526,6 +526,11 @@ class AbstractAssistantApp:
526
526
  voice_manager.stop()
527
527
  if self.debug:
528
528
  print("⏹ Voice stopped")
529
+
530
+ # Update icon status to ready since v0.5.1 callback won't fire for manual stops
531
+ self.update_icon_status("ready")
532
+ if self.debug:
533
+ print("🔄 Icon status set to ready after manual voice stop")
529
534
 
530
535
  # Always show chat bubble on double click
531
536
  if self.debug:
@@ -360,7 +360,10 @@ class QtChatBubble(QWidget):
360
360
  )
361
361
 
362
362
  # Set optimal size for modern chat interface - much wider to nearly touch screen edge
363
- self.setFixedSize(630, 196) # Increased width from 540 to 700 for better text display
363
+ # Initial size - will be adjusted dynamically based on file attachments
364
+ self.base_width = 630
365
+ self.base_height = 196
366
+ self.setFixedSize(self.base_width, self.base_height)
364
367
  self.position_near_tray()
365
368
 
366
369
  # Main layout with minimal spacing
@@ -440,10 +443,7 @@ class QtChatBubble(QWidget):
440
443
  self.full_voice_toggle.toggled.connect(self.on_full_voice_toggled)
441
444
  header_layout.addWidget(self.full_voice_toggle)
442
445
 
443
- # Add prominent voice control panel when TTS is active
444
- self.voice_control_panel = self.create_voice_control_panel()
445
- header_layout.addWidget(self.voice_control_panel)
446
- self.voice_control_panel.hide() # Hidden initially
446
+ # Voice control panel removed - not needed
447
447
 
448
448
  header_layout.addStretch()
449
449
 
@@ -565,8 +565,8 @@ class QtChatBubble(QWidget):
565
565
  }
566
566
  """)
567
567
  self.attached_files_layout = QHBoxLayout(self.attached_files_container)
568
- self.attached_files_layout.setContentsMargins(4, 4, 4, 4)
569
- self.attached_files_layout.setSpacing(4)
568
+ self.attached_files_layout.setContentsMargins(2, 2, 2, 2)
569
+ self.attached_files_layout.setSpacing(2)
570
570
  self.attached_files_container.hide() # Initially hidden
571
571
  input_layout.addWidget(self.attached_files_container)
572
572
  layout.addWidget(self.input_container)
@@ -1140,6 +1140,7 @@ class QtChatBubble(QWidget):
1140
1140
 
1141
1141
  if not self.attached_files:
1142
1142
  self.attached_files_container.hide()
1143
+ self._adjust_window_size_for_attachments()
1143
1144
  return
1144
1145
 
1145
1146
  # Show container and add file chips
@@ -1155,14 +1156,14 @@ class QtChatBubble(QWidget):
1155
1156
  QFrame {
1156
1157
  background: rgba(0, 102, 204, 0.2);
1157
1158
  border: 1px solid rgba(0, 102, 204, 0.4);
1158
- border-radius: 10px;
1159
- padding: 2px 8px;
1159
+ border-radius: 6px;
1160
+ padding: 1px 4px;
1160
1161
  }
1161
1162
  """)
1162
1163
 
1163
1164
  chip_layout = QHBoxLayout(file_chip)
1164
- chip_layout.setContentsMargins(4, 2, 4, 2)
1165
- chip_layout.setSpacing(4)
1165
+ chip_layout.setContentsMargins(2, 1, 2, 1)
1166
+ chip_layout.setSpacing(2)
1166
1167
 
1167
1168
  # File icon based on type
1168
1169
  ext = os.path.splitext(file_name)[1].lower()
@@ -1182,18 +1183,18 @@ class QtChatBubble(QWidget):
1182
1183
  icon = "📎"
1183
1184
 
1184
1185
  file_label = QLabel(f"{icon} {file_name[:20]}{'...' if len(file_name) > 20 else ''}")
1185
- file_label.setStyleSheet("background: transparent; border: none; color: rgba(255, 255, 255, 0.9); font-size: 10px;")
1186
+ file_label.setStyleSheet("background: transparent; border: none; color: rgba(255, 255, 255, 0.9); font-size: 8px;")
1186
1187
  chip_layout.addWidget(file_label)
1187
1188
 
1188
1189
  # Remove button
1189
1190
  remove_btn = QPushButton("✕")
1190
- remove_btn.setFixedSize(16, 16)
1191
+ remove_btn.setFixedSize(12, 12)
1191
1192
  remove_btn.setStyleSheet("""
1192
1193
  QPushButton {
1193
1194
  background: transparent;
1194
1195
  border: none;
1195
1196
  color: rgba(255, 255, 255, 0.6);
1196
- font-size: 10px;
1197
+ font-size: 8px;
1197
1198
  padding: 0px;
1198
1199
  }
1199
1200
  QPushButton:hover {
@@ -1206,6 +1207,30 @@ class QtChatBubble(QWidget):
1206
1207
  self.attached_files_layout.addWidget(file_chip)
1207
1208
 
1208
1209
  self.attached_files_layout.addStretch()
1210
+
1211
+ # Adjust window size to accommodate file attachments
1212
+ self._adjust_window_size_for_attachments()
1213
+
1214
+ def _adjust_window_size_for_attachments(self):
1215
+ """Dynamically adjust window size based on file attachments presence."""
1216
+ attachment_height = 28 # Height needed for file attachment container (reduced for compact chips)
1217
+
1218
+ if self.attached_files and self.attached_files_container.isVisible():
1219
+ # Files are attached - expand window
1220
+ new_height = self.base_height + attachment_height
1221
+ if self.debug:
1222
+ print(f"📏 Expanding window for attachments: {self.base_height} -> {new_height}")
1223
+ else:
1224
+ # No files attached - use base size
1225
+ new_height = self.base_height
1226
+ if self.debug:
1227
+ print(f"📏 Contracting window (no attachments): -> {new_height}")
1228
+
1229
+ # Apply new size
1230
+ self.setFixedSize(self.base_width, new_height)
1231
+
1232
+ # Reposition to maintain alignment with system tray
1233
+ self.position_near_tray()
1209
1234
 
1210
1235
  def remove_attached_file(self, file_path):
1211
1236
  """Remove a file from the attached files list."""
@@ -1403,6 +1428,14 @@ class QtChatBubble(QWidget):
1403
1428
  try:
1404
1429
  self.voice_manager.stop()
1405
1430
  self._update_tts_toggle_state()
1431
+
1432
+ # Manually trigger status update to "ready" since v0.5.1 callback won't fire
1433
+ # when we manually stop the audio
1434
+ if self.status_callback:
1435
+ if self.debug:
1436
+ print("🔊 QtChatBubble: TTS disabled, setting ready status")
1437
+ self.status_callback("ready")
1438
+
1406
1439
  except Exception as e:
1407
1440
  if self.debug:
1408
1441
  if self.debug:
@@ -1507,6 +1540,13 @@ class QtChatBubble(QWidget):
1507
1540
  # Safely update TTS toggle state
1508
1541
  if hasattr(self, '_update_tts_toggle_state'):
1509
1542
  self._update_tts_toggle_state()
1543
+
1544
+ # Manually trigger status update to "ready" since v0.5.1 callback won't fire
1545
+ # when we manually stop the audio
1546
+ if hasattr(self, 'status_callback') and self.status_callback:
1547
+ if self.debug:
1548
+ print("🔊 QtChatBubble: Manually stopped TTS, setting ready status")
1549
+ self.status_callback("ready")
1510
1550
 
1511
1551
  except Exception as e:
1512
1552
  if self.debug:
@@ -1680,7 +1720,10 @@ class QtChatBubble(QWidget):
1680
1720
  self.input_container.hide()
1681
1721
 
1682
1722
  # Update window size to be smaller but maintain wider width
1683
- self.setFixedSize(630, 120) # Reduced width by 10% to match normal size
1723
+ voice_base_height = 120
1724
+ attachment_height = 28 if (self.attached_files and self.attached_files_container.isVisible()) else 0
1725
+ voice_height = voice_base_height + attachment_height
1726
+ self.setFixedSize(self.base_width, voice_height) # Dynamic height for voice mode
1684
1727
 
1685
1728
  def show_text_ui(self):
1686
1729
  """Show the text input interface when exiting Full Voice Mode."""
@@ -1688,8 +1731,8 @@ class QtChatBubble(QWidget):
1688
1731
  if hasattr(self, 'input_container'):
1689
1732
  self.input_container.show()
1690
1733
 
1691
- # Restore normal window size with wider width
1692
- self.setFixedSize(630, 196)
1734
+ # Restore normal window size with wider width - use dynamic sizing
1735
+ self._adjust_window_size_for_attachments()
1693
1736
 
1694
1737
  def update_status(self, status_text: str):
1695
1738
  """Update the status label with the given text."""
@@ -1727,13 +1770,7 @@ class QtChatBubble(QWidget):
1727
1770
  current_state = self.voice_manager.get_state()
1728
1771
  # No longer updating tts_toggle appearance - it's a simple user control
1729
1772
 
1730
- # Show/hide voice control panel based on TTS state
1731
- if hasattr(self, 'voice_control_panel'):
1732
- if current_state in ['speaking', 'paused']:
1733
- self.voice_control_panel.show()
1734
- self._update_voice_control_panel(current_state)
1735
- else:
1736
- self.voice_control_panel.hide()
1773
+ # Voice control panel removed - no longer needed
1737
1774
 
1738
1775
  if self.debug:
1739
1776
  if self.debug:
@@ -1743,89 +1780,7 @@ class QtChatBubble(QWidget):
1743
1780
  if self.debug:
1744
1781
  print(f"❌ Error updating TTS toggle state: {e}")
1745
1782
 
1746
- def create_voice_control_panel(self):
1747
- """Create a prominent voice control panel that appears when TTS is active."""
1748
- panel = QWidget()
1749
- layout = QHBoxLayout()
1750
- layout.setContentsMargins(4, 2, 4, 2)
1751
- layout.setSpacing(4)
1752
-
1753
- # Pause/Resume button
1754
- self.voice_pause_button = QPushButton("⏸")
1755
- self.voice_pause_button.setFixedSize(24, 24)
1756
- self.voice_pause_button.setToolTip("Pause/Resume TTS (Space)")
1757
- self.voice_pause_button.clicked.connect(self.on_tts_single_click)
1758
- self.voice_pause_button.setStyleSheet("""
1759
- QPushButton {
1760
- background: rgba(255, 255, 255, 0.1);
1761
- border: 1px solid rgba(255, 255, 255, 0.2);
1762
- border-radius: 12px;
1763
- font-size: 12px;
1764
- color: rgba(255, 255, 255, 0.9);
1765
- font-weight: bold;
1766
- }
1767
- QPushButton:hover {
1768
- background: rgba(255, 255, 255, 0.2);
1769
- border: 1px solid rgba(255, 255, 255, 0.3);
1770
- }
1771
- QPushButton:pressed {
1772
- background: rgba(255, 255, 255, 0.05);
1773
- }
1774
- """)
1775
- layout.addWidget(self.voice_pause_button)
1776
-
1777
- # Stop button
1778
- self.voice_stop_button = QPushButton("⏹")
1779
- self.voice_stop_button.setFixedSize(24, 24)
1780
- self.voice_stop_button.setToolTip("Stop TTS (Escape)")
1781
- self.voice_stop_button.clicked.connect(self.on_tts_double_click)
1782
- self.voice_stop_button.setStyleSheet("""
1783
- QPushButton {
1784
- background: rgba(255, 100, 100, 0.1);
1785
- border: 1px solid rgba(255, 100, 100, 0.3);
1786
- border-radius: 12px;
1787
- font-size: 12px;
1788
- color: rgba(255, 200, 200, 0.9);
1789
- font-weight: bold;
1790
- }
1791
- QPushButton:hover {
1792
- background: rgba(255, 100, 100, 0.2);
1793
- border: 1px solid rgba(255, 100, 100, 0.4);
1794
- }
1795
- QPushButton:pressed {
1796
- background: rgba(255, 100, 100, 0.05);
1797
- }
1798
- """)
1799
- layout.addWidget(self.voice_stop_button)
1800
-
1801
- # Status text
1802
- self.voice_status_label = QLabel("Speaking...")
1803
- self.voice_status_label.setStyleSheet("""
1804
- QLabel {
1805
- color: rgba(255, 255, 255, 0.8);
1806
- font-size: 10px;
1807
- font-weight: 500;
1808
- padding: 2px 4px;
1809
- }
1810
- """)
1811
- layout.addWidget(self.voice_status_label)
1812
-
1813
- panel.setLayout(layout)
1814
- return panel
1815
-
1816
- def _update_voice_control_panel(self, state):
1817
- """Update the voice control panel based on TTS state."""
1818
- if not hasattr(self, 'voice_control_panel'):
1819
- return
1820
-
1821
- if state == 'speaking':
1822
- self.voice_pause_button.setText("⏸")
1823
- self.voice_pause_button.setToolTip("Pause TTS (Space)")
1824
- self.voice_status_label.setText("Speaking...")
1825
- elif state == 'paused':
1826
- self.voice_pause_button.setText("▶")
1827
- self.voice_pause_button.setToolTip("Resume TTS (Space)")
1828
- self.voice_status_label.setText("Paused")
1783
+ # Voice control panel methods removed - not needed
1829
1784
 
1830
1785
  def setup_keyboard_shortcuts(self):
1831
1786
  """Setup keyboard shortcuts for voice control."""
@@ -1975,7 +1930,7 @@ class QtChatBubble(QWidget):
1975
1930
  reply = QMessageBox.question(
1976
1931
  self,
1977
1932
  "Clear Session",
1978
- "Are you sure you want to clear the current session?\nThis will remove all messages and reset the token count.",
1933
+ "Are you sure you want to clear the current session?\nThis will remove all messages, attached files, and reset the token count.",
1979
1934
  QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
1980
1935
  QMessageBox.StandardButton.No
1981
1936
  )
@@ -1996,9 +1951,13 @@ class QtChatBubble(QWidget):
1996
1951
  self.token_count = 0
1997
1952
  self.update_token_display()
1998
1953
 
1954
+ # Clear attached files as part of session clearing
1955
+ self.attached_files.clear()
1956
+ self.update_attached_files_display()
1957
+
1999
1958
  if self.debug:
2000
1959
  if self.debug:
2001
- print("🧹 Session cleared")
1960
+ print("🧹 Session cleared (including attached files)")
2002
1961
 
2003
1962
  def load_session(self):
2004
1963
  """Load a session using AbstractCore via LLMManager."""
@@ -2154,6 +2113,27 @@ class QtChatBubble(QWidget):
2154
2113
  if self.debug:
2155
2114
  print(f"❌ Error updating message history from session: {e}")
2156
2115
 
2116
+ def _rebuild_chat_display(self):
2117
+ """Rebuild chat display after session loading.
2118
+
2119
+ Since the main bubble doesn't have a chat display area, this method
2120
+ updates the history dialog if it's currently open.
2121
+ """
2122
+ try:
2123
+ # If history dialog is open, refresh it with new message history
2124
+ if self.history_dialog and self.history_dialog.isVisible():
2125
+ self.history_dialog.refresh_messages(self.message_history)
2126
+ if self.debug:
2127
+ print("🔄 Refreshed history dialog with loaded session messages")
2128
+
2129
+ # No action needed if history dialog is closed since main bubble has no chat display
2130
+ if self.debug:
2131
+ print("✅ Chat display rebuild completed")
2132
+
2133
+ except Exception as e:
2134
+ if self.debug:
2135
+ print(f"❌ Error rebuilding chat display: {e}")
2136
+
2157
2137
  def _update_token_count_from_session(self):
2158
2138
  """Update token count from AbstractCore session."""
2159
2139
  try:
@@ -324,9 +324,10 @@ class IconGenerator:
324
324
  bar_color = (r, g, b, 255)
325
325
 
326
326
  # Draw 5 vertical bars with different vibration frequencies (like voice visualizer)
327
+ # Made much larger to match other menu bar icons
327
328
  bar_count = 5
328
- bar_width = size * 0.08
329
- bar_spacing = size * 0.12
329
+ bar_width = size * 0.15 # Increased from 0.08 to 0.15 (almost 2x wider)
330
+ bar_spacing = size * 0.18 # Increased from 0.12 to 0.18 (more spacing)
330
331
 
331
332
  for i in range(bar_count):
332
333
  # Each bar has slightly different frequency for realistic voice effect
@@ -334,8 +335,9 @@ class IconGenerator:
334
335
  bar_vibration = math.sin(current_time * bar_freq * 2 * math.pi)
335
336
 
336
337
  # Bar height varies with vibration (like audio visualizer)
337
- base_height = size * 0.15
338
- vibration_height = size * 0.25 * abs(bar_vibration)
338
+ # Made much taller to be more visible
339
+ base_height = size * 0.25 # Increased from 0.15 to 0.25
340
+ vibration_height = size * 0.35 * abs(bar_vibration) # Increased from 0.25 to 0.35
339
341
  total_height = base_height + vibration_height
340
342
 
341
343
  # Position bars horizontally across the icon
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractassistant
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: A sleek (macOS) system tray application providing instant access to LLMs
5
5
  Author-email: Laurent-Philippe Albou <contact@abstractcore.ai>
6
6
  License-Expression: MIT
@@ -28,7 +28,7 @@ Requires-Dist: PyQt5>=5.15.0
28
28
  Requires-Dist: markdown>=3.5.0
29
29
  Requires-Dist: pygments>=2.16.0
30
30
  Requires-Dist: pymdown-extensions>=10.0
31
- Requires-Dist: abstractvoice>=0.5.0
31
+ Requires-Dist: abstractvoice>=0.5.1
32
32
  Requires-Dist: pyperclip>=1.8.2
33
33
  Requires-Dist: plyer>=2.1.0
34
34
  Requires-Dist: tomli>=2.0.0; python_version < "3.11"
@@ -5,7 +5,7 @@ PyQt5>=5.15.0
5
5
  markdown>=3.5.0
6
6
  pygments>=2.16.0
7
7
  pymdown-extensions>=10.0
8
- abstractvoice>=0.5.0
8
+ abstractvoice>=0.5.1
9
9
  pyperclip>=1.8.2
10
10
  plyer>=2.1.0
11
11
  tomli-w>=1.0.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "abstractassistant"
7
- version = "0.3.0"
7
+ version = "0.3.1"
8
8
  description = "A sleek (macOS) system tray application providing instant access to LLMs"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -34,7 +34,7 @@ dependencies = [
34
34
  "markdown>=3.5.0",
35
35
  "pygments>=2.16.0",
36
36
  "pymdown-extensions>=10.0",
37
- "abstractvoice>=0.5.0",
37
+ "abstractvoice>=0.5.1",
38
38
  "pyperclip>=1.8.2",
39
39
  "plyer>=2.1.0",
40
40
  "tomli>=2.0.0; python_version<'3.11'",