arionxiv 1.0.32__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 (69) hide show
  1. arionxiv/__init__.py +40 -0
  2. arionxiv/__main__.py +10 -0
  3. arionxiv/arxiv_operations/__init__.py +0 -0
  4. arionxiv/arxiv_operations/client.py +225 -0
  5. arionxiv/arxiv_operations/fetcher.py +173 -0
  6. arionxiv/arxiv_operations/searcher.py +122 -0
  7. arionxiv/arxiv_operations/utils.py +293 -0
  8. arionxiv/cli/__init__.py +4 -0
  9. arionxiv/cli/commands/__init__.py +1 -0
  10. arionxiv/cli/commands/analyze.py +587 -0
  11. arionxiv/cli/commands/auth.py +365 -0
  12. arionxiv/cli/commands/chat.py +714 -0
  13. arionxiv/cli/commands/daily.py +482 -0
  14. arionxiv/cli/commands/fetch.py +217 -0
  15. arionxiv/cli/commands/library.py +295 -0
  16. arionxiv/cli/commands/preferences.py +426 -0
  17. arionxiv/cli/commands/search.py +254 -0
  18. arionxiv/cli/commands/settings_unified.py +1407 -0
  19. arionxiv/cli/commands/trending.py +41 -0
  20. arionxiv/cli/commands/welcome.py +168 -0
  21. arionxiv/cli/main.py +407 -0
  22. arionxiv/cli/ui/__init__.py +1 -0
  23. arionxiv/cli/ui/global_theme_manager.py +173 -0
  24. arionxiv/cli/ui/logo.py +127 -0
  25. arionxiv/cli/ui/splash.py +89 -0
  26. arionxiv/cli/ui/theme.py +32 -0
  27. arionxiv/cli/ui/theme_system.py +391 -0
  28. arionxiv/cli/utils/__init__.py +54 -0
  29. arionxiv/cli/utils/animations.py +522 -0
  30. arionxiv/cli/utils/api_client.py +583 -0
  31. arionxiv/cli/utils/api_config.py +505 -0
  32. arionxiv/cli/utils/command_suggestions.py +147 -0
  33. arionxiv/cli/utils/db_config_manager.py +254 -0
  34. arionxiv/github_actions_runner.py +206 -0
  35. arionxiv/main.py +23 -0
  36. arionxiv/prompts/__init__.py +9 -0
  37. arionxiv/prompts/prompts.py +247 -0
  38. arionxiv/rag_techniques/__init__.py +8 -0
  39. arionxiv/rag_techniques/basic_rag.py +1531 -0
  40. arionxiv/scheduler_daemon.py +139 -0
  41. arionxiv/server.py +1000 -0
  42. arionxiv/server_main.py +24 -0
  43. arionxiv/services/__init__.py +73 -0
  44. arionxiv/services/llm_client.py +30 -0
  45. arionxiv/services/llm_inference/__init__.py +58 -0
  46. arionxiv/services/llm_inference/groq_client.py +469 -0
  47. arionxiv/services/llm_inference/llm_utils.py +250 -0
  48. arionxiv/services/llm_inference/openrouter_client.py +564 -0
  49. arionxiv/services/unified_analysis_service.py +872 -0
  50. arionxiv/services/unified_auth_service.py +457 -0
  51. arionxiv/services/unified_config_service.py +456 -0
  52. arionxiv/services/unified_daily_dose_service.py +823 -0
  53. arionxiv/services/unified_database_service.py +1633 -0
  54. arionxiv/services/unified_llm_service.py +366 -0
  55. arionxiv/services/unified_paper_service.py +604 -0
  56. arionxiv/services/unified_pdf_service.py +522 -0
  57. arionxiv/services/unified_prompt_service.py +344 -0
  58. arionxiv/services/unified_scheduler_service.py +589 -0
  59. arionxiv/services/unified_user_service.py +954 -0
  60. arionxiv/utils/__init__.py +51 -0
  61. arionxiv/utils/api_helpers.py +200 -0
  62. arionxiv/utils/file_cleanup.py +150 -0
  63. arionxiv/utils/ip_helper.py +96 -0
  64. arionxiv-1.0.32.dist-info/METADATA +336 -0
  65. arionxiv-1.0.32.dist-info/RECORD +69 -0
  66. arionxiv-1.0.32.dist-info/WHEEL +5 -0
  67. arionxiv-1.0.32.dist-info/entry_points.txt +4 -0
  68. arionxiv-1.0.32.dist-info/licenses/LICENSE +21 -0
  69. arionxiv-1.0.32.dist-info/top_level.txt +1 -0
@@ -0,0 +1,391 @@
1
+ """
2
+ ArionXiv CLI Theme System - Consolidated theme management and selection
3
+ Combines theme.py and theme_selector.py functionality
4
+ """
5
+
6
+ from rich.console import Console
7
+ from rich.table import Table
8
+ from rich.panel import Panel
9
+ from rich.text import Text
10
+ from rich.columns import Columns
11
+ from rich.prompt import Prompt, IntPrompt
12
+ from typing import Dict, Any
13
+ from .logo import display_header
14
+ from .global_theme_manager import global_theme_manager
15
+
16
+ # Import animation utility
17
+ try:
18
+ from ..utils.animations import left_to_right_reveal
19
+ ANIMATIONS_AVAILABLE = True
20
+ except ImportError:
21
+ ANIMATIONS_AVAILABLE = False
22
+ def left_to_right_reveal(console, text, style="", duration=1.0):
23
+ console.print(text, style=style)
24
+
25
+ # Available color themes
26
+ AVAILABLE_THEMES = {
27
+ 'red': {
28
+ 'name': 'Classic Red',
29
+ 'primary': 'bright_red',
30
+ 'secondary': 'bright_red',
31
+ 'accent': 'bright_red',
32
+ 'success': 'bright_green',
33
+ 'warning': 'bright_yellow',
34
+ 'error': 'bright_red',
35
+ 'info': 'bright_red',
36
+ 'muted': 'dim white'
37
+ },
38
+ 'blue': {
39
+ 'name': 'Ocean Blue',
40
+ 'primary': 'bright_blue',
41
+ 'secondary': 'bright_blue',
42
+ 'accent': 'bright_blue',
43
+ 'success': 'bright_green',
44
+ 'warning': 'bright_yellow',
45
+ 'error': 'bright_red',
46
+ 'info': 'bright_blue',
47
+ 'muted': 'dim white'
48
+ },
49
+ 'green': {
50
+ 'name': 'Forest Green',
51
+ 'primary': 'bright_green',
52
+ 'secondary': 'bright_green',
53
+ 'accent': 'bright_green',
54
+ 'success': 'bright_green',
55
+ 'warning': 'yellow',
56
+ 'error': 'bright_red',
57
+ 'info': 'bright_green',
58
+ 'muted': 'dim white'
59
+ },
60
+ 'purple': {
61
+ 'name': 'Royal Purple',
62
+ 'primary': 'magenta',
63
+ 'secondary': 'magenta',
64
+ 'accent': 'magenta',
65
+ 'success': 'bright_green',
66
+ 'warning': 'bright_yellow',
67
+ 'error': 'bright_red',
68
+ 'info': 'magenta',
69
+ 'muted': 'dim white'
70
+ },
71
+ 'amber': {
72
+ 'name': 'Warm Amber',
73
+ 'primary': 'bright_yellow',
74
+ 'secondary': 'bright_yellow',
75
+ 'accent': 'bright_yellow',
76
+ 'success': 'bright_green',
77
+ 'warning': 'bright_yellow',
78
+ 'error': 'bright_red',
79
+ 'info': 'bright_yellow',
80
+ 'muted': 'dim white'
81
+ },
82
+ 'cyan': {
83
+ 'name': 'Electric Cyan',
84
+ 'primary': 'bright_cyan',
85
+ 'secondary': 'bright_cyan',
86
+ 'accent': 'bright_cyan',
87
+ 'success': 'bright_green',
88
+ 'warning': 'bright_yellow',
89
+ 'error': 'bright_red',
90
+ 'info': 'bright_cyan',
91
+ 'muted': 'dim white'
92
+ }
93
+ }
94
+
95
+ # Current theme colors (will be set dynamically)
96
+ THEME_COLORS = AVAILABLE_THEMES['blue'].copy() # Default to blue
97
+
98
+ # ================================
99
+ # CORE THEME FUNCTIONS
100
+ # ================================
101
+
102
+ def get_current_theme_color():
103
+ """Get the current theme color from global theme manager"""
104
+ return global_theme_manager.get_current_theme()
105
+
106
+ def set_theme_colors(theme_name=None):
107
+ """Set the global theme colors"""
108
+ global THEME_COLORS
109
+
110
+ # Use current theme from global manager if no theme specified
111
+ if theme_name is None:
112
+ theme_name = global_theme_manager.get_current_theme()
113
+
114
+ if theme_name in AVAILABLE_THEMES:
115
+ THEME_COLORS = AVAILABLE_THEMES[theme_name].copy()
116
+ else:
117
+ # Fallback to blue if theme not found
118
+ THEME_COLORS = AVAILABLE_THEMES['blue'].copy()
119
+
120
+ # Update global theme manager
121
+ global_theme_manager.set_theme(theme_name)
122
+
123
+ def get_theme_colors():
124
+ """Get current theme colors, loading from config if needed"""
125
+ current_theme = get_current_theme_color()
126
+ set_theme_colors(current_theme)
127
+ return THEME_COLORS
128
+
129
+ # ================================
130
+ # THEME CREATION FUNCTIONS
131
+ # ================================
132
+
133
+ def create_themed_console():
134
+ """Create a console with current theme"""
135
+ get_theme_colors() # Ensure theme is loaded
136
+ return Console()
137
+
138
+ def create_themed_table(title: str = None, show_header: bool = True):
139
+ """Create a table with current theme"""
140
+ colors = get_theme_colors()
141
+ table = Table(
142
+ title=title,
143
+ show_header=show_header,
144
+ header_style=f"bold {colors['primary']}",
145
+ border_style=f"bold {colors['primary']}",
146
+ title_style=f"bold {colors['primary']}"
147
+ )
148
+ return table
149
+
150
+ def create_themed_panel(content: str, title: str = None, border_style: str = None):
151
+ """Create a panel with current theme"""
152
+ colors = get_theme_colors()
153
+ if border_style is None:
154
+ border_style = f"bold {colors['primary']}"
155
+
156
+ return Panel(
157
+ content,
158
+ title=f"[bold {colors['primary']}]{title}[/bold {colors['primary']}]" if title else None,
159
+ border_style=border_style,
160
+ padding=(1, 2)
161
+ )
162
+
163
+ # ================================
164
+ # PRINTING FUNCTIONS
165
+ # ================================
166
+
167
+ def print_header(console: Console, title: str = None):
168
+ """Print header with mini logo and optional title"""
169
+ colors = get_theme_colors()
170
+ display_header(console)
171
+ if title:
172
+ console.print(f"\n[bold {colors['primary']}]{title}[/bold {colors['primary']}]\n")
173
+
174
+ def print_success(console: Console, message: str):
175
+ """Print success message with theme and animation"""
176
+ colors = get_theme_colors()
177
+ left_to_right_reveal(console, f"[SUCCESS] {message}", style=f"bold {colors['primary']}", duration=1.0)
178
+
179
+ def print_error(console: Console, message: str):
180
+ """Print error message with theme and animation"""
181
+ colors = get_theme_colors()
182
+ left_to_right_reveal(console, f"[ERROR] {message}", style=f"bold {colors['error']}", duration=1.0)
183
+
184
+ def print_warning(console: Console, message: str):
185
+ """Print warning message with theme and animation"""
186
+ colors = get_theme_colors()
187
+ left_to_right_reveal(console, f"[WARNING] {message}", style=f"bold {colors['warning']}", duration=1.0)
188
+
189
+ def print_info(console: Console, message: str):
190
+ """Print info message with theme and animation"""
191
+ colors = get_theme_colors()
192
+ left_to_right_reveal(console, f"[INFO] {message}", style=f"bold {colors['primary']}", duration=1.0)
193
+
194
+ def style_text(text: str, style: str = 'primary'):
195
+ """Apply theme styling to text"""
196
+ colors = get_theme_colors()
197
+ color = colors.get(style, style)
198
+ return f"[{color}]{text}[/{color}]"
199
+
200
+ # ================================
201
+ # THEME SELECTION FUNCTIONS
202
+ # ================================
203
+
204
+ def display_theme_preview(console: Console, theme_name: str, theme_data: Dict[str, str]):
205
+ """Display a clean preview of a theme - just name and color"""
206
+ primary = theme_data['primary']
207
+
208
+ # Clean, minimal preview
209
+ preview = Text()
210
+ preview.append("ARIONXIV", style=f"bold {primary}")
211
+
212
+ return Panel(
213
+ preview,
214
+ title=f"[bold {primary}]{theme_data['name']}[/bold {primary}]",
215
+ border_style=f"bold {primary}",
216
+ padding=(0, 2)
217
+ )
218
+
219
+ def show_all_themes(console: Console):
220
+ """Display all available themes with clean previews"""
221
+ from ..utils.animations import left_to_right_reveal
222
+ colors = get_theme_colors()
223
+
224
+ left_to_right_reveal(console, "Available Color Themes", style=f"bold {colors['primary']}", duration=0.5)
225
+ console.print()
226
+
227
+ themes_list = list(AVAILABLE_THEMES.items())
228
+
229
+ # Show themes in groups of 3
230
+ for i in range(0, len(themes_list), 3):
231
+ panels = []
232
+ for j in range(3):
233
+ if i + j < len(themes_list):
234
+ theme = themes_list[i + j]
235
+ panels.append(display_theme_preview(console, theme[0], theme[1]))
236
+
237
+ console.print(Columns(panels, equal=True))
238
+
239
+ def show_themes_table(console: Console):
240
+ """Show themes in a compact list format"""
241
+ from ..utils.animations import left_to_right_reveal
242
+ colors = get_theme_colors()
243
+
244
+ left_to_right_reveal(console, "Available Themes", style=f"bold {colors['primary']}", duration=0.5)
245
+ console.print()
246
+
247
+ for i, (theme_key, theme_data) in enumerate(AVAILABLE_THEMES.items(), 1):
248
+ primary = theme_data['primary']
249
+ left_to_right_reveal(
250
+ console,
251
+ f" {i}. {theme_data['name']}",
252
+ style=f"bold {primary}",
253
+ duration=0.3
254
+ )
255
+
256
+ def get_theme_choice(console: Console, show_previews: bool = True) -> str:
257
+ """Get user's theme choice with clean interface"""
258
+ from ..utils.animations import left_to_right_reveal
259
+
260
+ # Show themes in cute boxes
261
+ show_all_themes(console)
262
+
263
+ console.print()
264
+ themes_list = list(AVAILABLE_THEMES.keys())
265
+ colors = get_theme_colors()
266
+
267
+ while True:
268
+ try:
269
+ choice = IntPrompt.ask(
270
+ f"[bold {colors['primary']}]Select theme (1-6)[/bold {colors['primary']}]",
271
+ choices=[str(i) for i in range(1, len(themes_list) + 1)],
272
+ show_choices=False
273
+ )
274
+
275
+ selected_theme = themes_list[choice - 1]
276
+ theme_data = AVAILABLE_THEMES[selected_theme]
277
+ selected_color = theme_data['primary']
278
+
279
+ console.print()
280
+ left_to_right_reveal(
281
+ console,
282
+ f"Selected: {theme_data['name']}",
283
+ style=f"bold {selected_color}",
284
+ duration=0.5
285
+ )
286
+
287
+ # Use the selected theme color for the Confirm prompt, show y/n options
288
+ confirm = Prompt.ask(
289
+ f"[bold {selected_color}]Confirm? (y/n)[/bold {selected_color}]",
290
+ choices=["y", "n"],
291
+ default="y",
292
+ show_choices=False
293
+ ).lower()
294
+
295
+ if confirm == "y":
296
+ return selected_theme
297
+ else:
298
+ console.print()
299
+ continue
300
+
301
+ except (ValueError, EOFError, KeyboardInterrupt):
302
+ left_to_right_reveal(console, "Cancelled. Using current theme.", style="white", duration=0.5)
303
+ return get_current_theme_color()
304
+
305
+ def run_theme_selection(console: Console, compact: bool = False) -> str:
306
+ """Run the complete theme selection process - clean and minimal"""
307
+ from ..utils.animations import left_to_right_reveal
308
+
309
+ console.print()
310
+ colors = get_theme_colors()
311
+ left_to_right_reveal(console, "Theme Selection", style=f"bold {colors['primary']}", duration=0.5)
312
+ console.print()
313
+
314
+ # Get user choice
315
+ selected_theme = get_theme_choice(console, show_previews=not compact)
316
+
317
+ # Show clean confirmation
318
+ theme_data = AVAILABLE_THEMES[selected_theme]
319
+ console.print()
320
+ left_to_right_reveal(
321
+ console,
322
+ f"Theme set to {theme_data['name']}",
323
+ style=f"bold {theme_data['primary']}",
324
+ duration=1.0
325
+ )
326
+ console.print()
327
+
328
+ return selected_theme
329
+
330
+ def quick_theme_select(console: Console) -> str:
331
+ """Quick theme selection without previews"""
332
+ return get_theme_choice(console, show_previews=False)
333
+
334
+ # ================================
335
+ # VALIDATION AND UTILITIES
336
+ # ================================
337
+
338
+ def is_valid_theme(theme_name: str) -> bool:
339
+ """Check if a theme name is valid"""
340
+ return theme_name in AVAILABLE_THEMES
341
+
342
+ def get_theme_info(theme_name: str) -> Dict[str, Any]:
343
+ """Get information about a specific theme"""
344
+ if theme_name in AVAILABLE_THEMES:
345
+ return AVAILABLE_THEMES[theme_name].copy()
346
+ return {}
347
+
348
+ def list_available_themes() -> list:
349
+ """Get list of available theme names"""
350
+ return list(AVAILABLE_THEMES.keys())
351
+
352
+ def get_theme_names_and_descriptions() -> Dict[str, str]:
353
+ """Get mapping of theme keys to display names"""
354
+ return {key: data['name'] for key, data in AVAILABLE_THEMES.items()}
355
+
356
+ # ================================
357
+ # BACKWARDS COMPATIBILITY
358
+ # ================================
359
+
360
+ # Ensure backwards compatibility with existing imports
361
+ def create_themed_console_legacy():
362
+ """Legacy function name for backwards compatibility"""
363
+ return create_themed_console()
364
+
365
+ # Export all theme-related functionality
366
+ __all__ = [
367
+ 'AVAILABLE_THEMES',
368
+ 'THEME_COLORS',
369
+ 'get_current_theme_color',
370
+ 'set_theme_colors',
371
+ 'get_theme_colors',
372
+ 'create_themed_console',
373
+ 'create_themed_table',
374
+ 'create_themed_panel',
375
+ 'print_header',
376
+ 'print_success',
377
+ 'print_error',
378
+ 'print_warning',
379
+ 'print_info',
380
+ 'style_text',
381
+ 'display_theme_preview',
382
+ 'show_all_themes',
383
+ 'show_themes_table',
384
+ 'get_theme_choice',
385
+ 'run_theme_selection',
386
+ 'quick_theme_select',
387
+ 'is_valid_theme',
388
+ 'get_theme_info',
389
+ 'list_available_themes',
390
+ 'get_theme_names_and_descriptions'
391
+ ]
@@ -0,0 +1,54 @@
1
+ """Utils Package"""
2
+
3
+ from .animations import (
4
+ slam_content,
5
+ slam_columns,
6
+ shake_content,
7
+ shake_text,
8
+ shake_columns,
9
+ shake_panel,
10
+ left_to_right_reveal,
11
+ top_to_bottom_reveal,
12
+ typewriter_reveal,
13
+ stream_text_response,
14
+ stream_markdown_response,
15
+ )
16
+
17
+ from .command_suggestions import (
18
+ show_command_suggestions,
19
+ show_back_to_home,
20
+ )
21
+
22
+ from .api_config import (
23
+ api_config_manager,
24
+ run_first_time_api_setup,
25
+ show_api_status,
26
+ )
27
+
28
+ from .api_client import (
29
+ ArionXivAPIClient,
30
+ APIClientError,
31
+ api_client,
32
+ )
33
+
34
+ __all__ = [
35
+ 'slam_content',
36
+ 'slam_columns',
37
+ 'shake_content',
38
+ 'shake_text',
39
+ 'shake_columns',
40
+ 'shake_panel',
41
+ 'left_to_right_reveal',
42
+ 'top_to_bottom_reveal',
43
+ 'typewriter_reveal',
44
+ 'stream_text_response',
45
+ 'stream_markdown_response',
46
+ 'show_command_suggestions',
47
+ 'show_back_to_home',
48
+ 'api_config_manager',
49
+ 'run_first_time_api_setup',
50
+ 'show_api_status',
51
+ 'ArionXivAPIClient',
52
+ 'APIClientError',
53
+ 'api_client',
54
+ ]