sqlsaber 0.8.0__tar.gz → 0.8.2__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.
Potentially problematic release.
This version of sqlsaber might be problematic. Click here for more details.
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/CHANGELOG.md +13 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/PKG-INFO +1 -1
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/pyproject.toml +1 -1
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/display.py +7 -5
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/interactive.py +9 -2
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/config/settings.py +11 -7
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/uv.lock +1 -1
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/.github/workflows/publish.yml +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/.gitignore +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/.python-version +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/CLAUDE.md +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/LICENSE +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/README.md +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/pytest.ini +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/sqlsaber.svg +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/__main__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/agents/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/agents/anthropic.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/agents/base.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/agents/mcp.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/agents/streaming.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/auth.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/commands.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/completers.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/database.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/memory.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/models.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/cli/streaming.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/clients/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/clients/anthropic.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/clients/base.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/clients/exceptions.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/clients/models.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/clients/streaming.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/config/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/config/api_keys.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/config/auth.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/config/database.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/config/oauth_flow.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/config/oauth_tokens.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/database/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/database/connection.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/database/schema.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/mcp/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/mcp/mcp.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/memory/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/memory/manager.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/memory/storage.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/models/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/models/events.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/src/sqlsaber/models/types.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/conftest.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_agents/test_anthropic_oauth.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_cli/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_cli/test_commands.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_clients/test_anthropic_client.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_clients/test_streaming.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_config/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_config/test_database.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_config/test_oauth.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_config/test_settings.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_database/__init__.py +0 -0
- {sqlsaber-0.8.0 → sqlsaber-0.8.2}/tests/test_database/test_connection.py +0 -0
|
@@ -4,6 +4,19 @@ All notable changes to SQLSaber will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.8.2] - 2025-07-08
|
|
8
|
+
|
|
9
|
+
## Changed
|
|
10
|
+
|
|
11
|
+
- Updated formatting for final answer display
|
|
12
|
+
- New ASCII art in interactive mode
|
|
13
|
+
|
|
14
|
+
## [0.8.1] - 2025-07-07
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Fixed OAuth validation logic to not require API key when Claude Pro OAuth is configured
|
|
19
|
+
|
|
7
20
|
## [0.8.0] - 2025-07-07
|
|
8
21
|
|
|
9
22
|
### Added
|
|
@@ -4,6 +4,7 @@ import json
|
|
|
4
4
|
|
|
5
5
|
from rich.console import Console
|
|
6
6
|
from rich.markdown import Markdown
|
|
7
|
+
from rich.panel import Panel
|
|
7
8
|
from rich.syntax import Syntax
|
|
8
9
|
from rich.table import Table
|
|
9
10
|
|
|
@@ -244,7 +245,7 @@ class DisplayManager:
|
|
|
244
245
|
self.show_error(f"Error displaying plot: {str(e)}")
|
|
245
246
|
|
|
246
247
|
def show_markdown_response(self, content: list):
|
|
247
|
-
"""Display the assistant's response as rich markdown."""
|
|
248
|
+
"""Display the assistant's response as rich markdown in a panel."""
|
|
248
249
|
if not content:
|
|
249
250
|
return
|
|
250
251
|
|
|
@@ -256,10 +257,11 @@ class DisplayManager:
|
|
|
256
257
|
if text:
|
|
257
258
|
text_parts.append(text)
|
|
258
259
|
|
|
259
|
-
# Join all text parts and display as markdown
|
|
260
|
+
# Join all text parts and display as markdown in a panel
|
|
260
261
|
full_text = "".join(text_parts).strip()
|
|
261
262
|
if full_text:
|
|
262
|
-
self.console.print() # Add spacing before
|
|
263
|
+
self.console.print() # Add spacing before panel
|
|
263
264
|
markdown = Markdown(full_text)
|
|
264
|
-
|
|
265
|
-
self.console.print()
|
|
265
|
+
panel = Panel.fit(markdown, border_style="green")
|
|
266
|
+
self.console.print(panel)
|
|
267
|
+
self.console.print() # Add spacing after panel
|
|
@@ -36,8 +36,15 @@ class InteractiveSession:
|
|
|
36
36
|
|
|
37
37
|
self.console.print(
|
|
38
38
|
Panel.fit(
|
|
39
|
-
"
|
|
40
|
-
|
|
39
|
+
"""
|
|
40
|
+
███████ ██████ ██ ███████ █████ ██████ ███████ ██████
|
|
41
|
+
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
|
42
|
+
███████ ██ ██ ██ ███████ ███████ ██████ █████ ██████
|
|
43
|
+
██ ██ ▄▄ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
|
44
|
+
███████ ██████ ███████ ███████ ██ ██ ██████ ███████ ██ ██
|
|
45
|
+
▀▀
|
|
46
|
+
"""
|
|
47
|
+
"\n\n"
|
|
41
48
|
"[dim]Use '/clear' to reset conversation, '/exit' or '/quit' to leave.[/dim]\n\n"
|
|
42
49
|
"[dim]Start a message with '#' to add something to agent's memory for this database.[/dim]\n\n"
|
|
43
50
|
"[dim]Type '@' to get table name completions.[/dim]",
|
|
@@ -117,10 +117,14 @@ class Config:
|
|
|
117
117
|
|
|
118
118
|
def validate(self):
|
|
119
119
|
"""Validate that necessary configuration is present."""
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
120
|
+
# 1. Claude-Pro flow → require OAuth token only
|
|
121
|
+
if self.auth_method == AuthMethod.CLAUDE_PRO:
|
|
122
|
+
if not self.oauth_token:
|
|
123
|
+
raise ValueError(
|
|
124
|
+
"OAuth token not available. Run 'saber auth setup' to authenticate with Claude Pro."
|
|
125
|
+
)
|
|
126
|
+
return # OAuth path satisfied – nothing more to check
|
|
127
|
+
|
|
128
|
+
# 2. Default / API-key flow → require API key
|
|
129
|
+
if not self.api_key:
|
|
130
|
+
raise ValueError("Anthropic API key not found.")
|
|
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
|
|
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
|