abstractassistant 0.3.0__py3-none-any.whl → 0.3.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.
- abstractassistant/app.py +5 -0
- abstractassistant/ui/qt_bubble.py +89 -109
- abstractassistant/utils/icon_generator.py +6 -4
- {abstractassistant-0.3.0.dist-info → abstractassistant-0.3.1.dist-info}/METADATA +2 -2
- {abstractassistant-0.3.0.dist-info → abstractassistant-0.3.1.dist-info}/RECORD +9 -9
- {abstractassistant-0.3.0.dist-info → abstractassistant-0.3.1.dist-info}/WHEEL +0 -0
- {abstractassistant-0.3.0.dist-info → abstractassistant-0.3.1.dist-info}/entry_points.txt +0 -0
- {abstractassistant-0.3.0.dist-info → abstractassistant-0.3.1.dist-info}/licenses/LICENSE +0 -0
- {abstractassistant-0.3.0.dist-info → abstractassistant-0.3.1.dist-info}/top_level.txt +0 -0
abstractassistant/app.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
#
|
|
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(
|
|
569
|
-
self.attached_files_layout.setSpacing(
|
|
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:
|
|
1159
|
-
padding:
|
|
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(
|
|
1165
|
-
chip_layout.setSpacing(
|
|
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:
|
|
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(
|
|
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:
|
|
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
|
-
|
|
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.
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
338
|
-
|
|
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.
|
|
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.
|
|
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"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
setup_macos_app.py,sha256=9dIPr9TipjtgdIhd0MnR2syRNoFyBVMnRsWDW0UCT3A,10736
|
|
2
2
|
abstractassistant/__init__.py,sha256=homfqMDh6sX2nBROtk6-y72jnrStPph8gEOeT0OjKyU,35
|
|
3
|
-
abstractassistant/app.py,sha256=
|
|
3
|
+
abstractassistant/app.py,sha256=yGFszbaqja_Y1ejSMcVYIcq8f1qdeZpVTb032geI-ZE,40374
|
|
4
4
|
abstractassistant/cli.py,sha256=SQPxQCLjX-LOlhSEvG302D0AOyxlxo5QM2imxr9wxmc,4385
|
|
5
5
|
abstractassistant/config.py,sha256=KodfPYTpHtavJyne-h-B-r3kbEt1uusSY8GknGLtDL8,5809
|
|
6
6
|
abstractassistant/create_app_bundle.py,sha256=LAZdp2C90ikMVd3KPdwNYBYUASbHpypOJIwvx6fQyXM,1698
|
|
@@ -12,17 +12,17 @@ abstractassistant/ui/__init__.py,sha256=aRNE2pS50nFAX6y--rSGMNYwhz905g14gRd6g4Bo
|
|
|
12
12
|
abstractassistant/ui/chat_bubble.py,sha256=TE6zPtQ46I9grKGAb744wHqk4yO6-und3iif8_33XGk,11357
|
|
13
13
|
abstractassistant/ui/history_dialog.py,sha256=25EVyf3-8Kaw1bZPTZe8G-uqw_KnP2t--OgAjsxC06w,18548
|
|
14
14
|
abstractassistant/ui/provider_manager.py,sha256=9IM-BxIs6lUlk6cDCBi7oZFMXmn4CFMlxh0s-_vhzXY,8403
|
|
15
|
-
abstractassistant/ui/qt_bubble.py,sha256
|
|
15
|
+
abstractassistant/ui/qt_bubble.py,sha256=-J2wzpv9dQ1PCrFyKKNe0fF4SLRskiBtzSvMYrg94cY,96264
|
|
16
16
|
abstractassistant/ui/toast_manager.py,sha256=1aU4DPo-J45bC61gTEctHq98ZrHIFxRfZa_9Q8KF588,13721
|
|
17
17
|
abstractassistant/ui/toast_window.py,sha256=BRSwEBlaND5LLipn1HOX0ISWxVH-zOHsYplFkiPaj_g,21727
|
|
18
18
|
abstractassistant/ui/tts_state_manager.py,sha256=UF_zrfl9wf0hNHBGxevcoKxW5Dh7zXibUSVoSSjGP4o,10565
|
|
19
19
|
abstractassistant/ui/ui_styles.py,sha256=FvE2CVUbHmHu1PKVTBBGyhbt781qh4WjLMrHviln39s,13120
|
|
20
20
|
abstractassistant/utils/__init__.py,sha256=7Q3BxyXETkt3tm5trhuLTyL8PoECOK0QiK-0KUVAR2Q,16
|
|
21
|
-
abstractassistant/utils/icon_generator.py,sha256=
|
|
21
|
+
abstractassistant/utils/icon_generator.py,sha256=SWPgi1V6_8544Zbc2vAfFXAy15H35neyUGCYt2eKoic,16475
|
|
22
22
|
abstractassistant/utils/markdown_renderer.py,sha256=u5tVIhulSwRYADiqJcZNoHhU8e6pJVgzrwZRd61Bov0,12585
|
|
23
|
-
abstractassistant-0.3.
|
|
24
|
-
abstractassistant-0.3.
|
|
25
|
-
abstractassistant-0.3.
|
|
26
|
-
abstractassistant-0.3.
|
|
27
|
-
abstractassistant-0.3.
|
|
28
|
-
abstractassistant-0.3.
|
|
23
|
+
abstractassistant-0.3.1.dist-info/licenses/LICENSE,sha256=QUjFNAE-0yOkW9-Rle2axkpkt9H7xiZ2VbN-VeONhxc,1106
|
|
24
|
+
abstractassistant-0.3.1.dist-info/METADATA,sha256=NVlJ6qu94oAUwf9sOqzgsUMFsMu3CN8h6v0eTaC7WRc,11320
|
|
25
|
+
abstractassistant-0.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
26
|
+
abstractassistant-0.3.1.dist-info/entry_points.txt,sha256=MIzeCh0XG6MbhIzBHtkdEjmjxYBsQrGFevq8Y1L8Jkc,118
|
|
27
|
+
abstractassistant-0.3.1.dist-info/top_level.txt,sha256=oEcSXZAqbflTfZRfF4dogUq6TC1Nqyplq4JgC0CZnLI,34
|
|
28
|
+
abstractassistant-0.3.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|