dbagent-cli 0.7.3__tar.gz → 0.8.0__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.
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/PKG-INFO +1 -1
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/__init__.py +1 -1
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/cli.py +12 -4
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/ui/chat_screen.py +46 -26
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/PKG-INFO +1 -1
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/pyproject.toml +1 -1
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/README.md +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/agent/confidence.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/agent/conversation.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/agent/doctor.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/agent/error_classifier.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/agent/generator.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/agent/pipeline.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/agent/recommender.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/agent/validator.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/config.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/connectors/base.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/connectors/factory.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/connectors/mongo.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/connectors/relational.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/execution/__init__.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/execution/cache.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/execution/changeset.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/execution/cost.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/execution/recovery.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/execution/sandbox.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/execution/streaming.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/anthropic_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/auto_setup.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/base.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/deepseek_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/factory.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/gemini_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/groq_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/mistral_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/mock_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/ollama_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/openai_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/llm/openrouter_provider.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/schema/cache.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/schema/formatter.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/schema/graph.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/schema/models.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/schema/retriever.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/schema/selector.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/security/__init__.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/security/audit.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/security/environment.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/security/masking.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/security/modes.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/security/rbac.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/semantic/__init__.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/semantic/dictionary.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/semantic/templates.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/sql/__init__.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/sql/optimizer.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/sql/validator.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/ui/console.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/ui/grid_window.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/ui/viewer.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent/ui/visualizer.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/SOURCES.txt +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/dependency_links.txt +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/entry_points.txt +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/requires.txt +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/top_level.txt +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/setup.cfg +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_cache.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_cli.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_connectors.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_direct_sql.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_doctor_and_viz.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_generator.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_graph.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_providers.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_recovery.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_safety.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_sandbox.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_schema.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_security.py +0 -0
- {dbagent_cli-0.7.3 → dbagent_cli-0.8.0}/tests/test_semantic.py +0 -0
|
@@ -9,6 +9,13 @@ import json
|
|
|
9
9
|
import time
|
|
10
10
|
import threading
|
|
11
11
|
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
if sys.platform == "win32":
|
|
14
|
+
try:
|
|
15
|
+
sys.stdout.reconfigure(encoding="utf-8")
|
|
16
|
+
sys.stderr.reconfigure(encoding="utf-8")
|
|
17
|
+
except Exception:
|
|
18
|
+
pass
|
|
12
19
|
from typing import Optional, List, Dict, Any
|
|
13
20
|
import typer
|
|
14
21
|
from rich.prompt import Prompt, Confirm
|
|
@@ -508,17 +515,18 @@ def chat_command(
|
|
|
508
515
|
def _get_bottom_toolbar():
|
|
509
516
|
curr_model = model or getattr(llm, "default_model", "default")
|
|
510
517
|
return HTML(
|
|
511
|
-
f" <b><ansigreen
|
|
512
|
-
f"<b><ansicyan>🤖
|
|
518
|
+
f" <b><ansigreen>● Connected:</ansigreen></b> <ansibrightwhite>{db_name}</ansibrightwhite> <ansidarkgray>({dialect} • {len(table_names)} tables)</ansidarkgray> │ "
|
|
519
|
+
f"<b><ansicyan>🤖 {curr_model}</ansicyan></b> <ansidarkgray>({llm.name})</ansidarkgray> │ "
|
|
513
520
|
f"<b><ansiyellow>🛡️ {current_mode.value}</ansiyellow></b> │ "
|
|
514
|
-
f"<ansidarkgray
|
|
521
|
+
f"<ansidarkgray><b>:help</b> for commands · <b>:models</b> to switch</ansidarkgray> "
|
|
515
522
|
)
|
|
516
523
|
|
|
517
524
|
while True:
|
|
518
525
|
try:
|
|
519
526
|
user_input = session.prompt(
|
|
520
|
-
HTML("<
|
|
527
|
+
HTML("<ansired><b>❯</b></ansired> "),
|
|
521
528
|
bottom_toolbar=_get_bottom_toolbar,
|
|
529
|
+
placeholder=HTML("<ansidarkgray><i>Ask in plain English or paste SQL (e.g. \"list active users\")...</i></ansidarkgray>"),
|
|
522
530
|
).strip()
|
|
523
531
|
if not user_input:
|
|
524
532
|
continue
|
|
@@ -26,6 +26,15 @@ def clear_screen() -> None:
|
|
|
26
26
|
os.system("cls" if os.name == "nt" else "clear")
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
MASCOT_ART = """
|
|
30
|
+
▄ ▄
|
|
31
|
+
██▀█ █▀██
|
|
32
|
+
█████████
|
|
33
|
+
█ █ █ █ █
|
|
34
|
+
█ █
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
|
|
29
38
|
def render_chat_header(
|
|
30
39
|
db_name: str,
|
|
31
40
|
dialect: str,
|
|
@@ -35,33 +44,44 @@ def render_chat_header(
|
|
|
35
44
|
mode: str = "CONFIRM",
|
|
36
45
|
recommendations: Optional[List[str]] = None,
|
|
37
46
|
) -> None:
|
|
38
|
-
"""Render the
|
|
39
|
-
model_str =
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
47
|
+
"""Render the exact Claude Code CLI split-card header panel."""
|
|
48
|
+
model_str = ai_model or "gemini-3.6-flash"
|
|
49
|
+
|
|
50
|
+
# Left Column: Greeting, Mascot, Connected Model & DB Path
|
|
51
|
+
left_grid = Table.grid(padding=(0, 1))
|
|
52
|
+
left_grid.add_column(justify="center", min_width=28)
|
|
53
|
+
left_grid.add_row("[bold white]Welcome back![/bold white]")
|
|
54
|
+
left_grid.add_row(f"[bold #D97757]{MASCOT_ART.strip()}[/bold #D97757]")
|
|
55
|
+
left_grid.add_row(f"[dim white]{model_str} · {ai_provider}[/dim white]")
|
|
56
|
+
left_grid.add_row(f"[dim]{db_name} ({dialect} • {table_count} tables)[/dim]")
|
|
57
|
+
|
|
58
|
+
# Right Column: Tips for getting started + What's new in v0.8.0
|
|
59
|
+
right_grid = Table.grid(padding=(0, 1))
|
|
60
|
+
right_grid.add_column()
|
|
61
|
+
right_grid.add_row("[bold #D97757]Tips for getting started[/bold #D97757]")
|
|
62
|
+
right_grid.add_row("[dim]Ask in plain English or paste direct SQL for 0ms execution[/dim]")
|
|
63
|
+
right_grid.add_row("[dim]Type :help to inspect tables (:tables), relations (:fk), or diagnostics (:doctor)[/dim]")
|
|
64
|
+
right_grid.add_row("[dim]────────────────────────────────────────────────────────────────────────[/dim]")
|
|
65
|
+
right_grid.add_row("[bold #D97757]What's new in v0.8.0[/bold #D97757]")
|
|
66
|
+
right_grid.add_row("[dim]Added Universal AI: Claude 3.7 Sonnet, OpenAI GPT-4o, DeepSeek R1, Mistral, Gemini[/dim]")
|
|
67
|
+
right_grid.add_row("[dim]Added Zero-Latency Direct SQL Fast-Path with autonomous AI auto-repair on error[/dim]")
|
|
68
|
+
right_grid.add_row("[dim]Added Multi-turn conversational session memory graph & persistent connection pooling[/dim]")
|
|
69
|
+
|
|
70
|
+
layout_table = Table.grid(expand=True, padding=(0, 2))
|
|
71
|
+
layout_table.add_column(ratio=2)
|
|
72
|
+
layout_table.add_column(ratio=3)
|
|
73
|
+
layout_table.add_row(left_grid, right_grid)
|
|
74
|
+
|
|
75
|
+
header_panel = Panel(
|
|
76
|
+
layout_table,
|
|
77
|
+
title=f"[bold #D97757] DB-Agent v{__version__} [/bold #D97757]",
|
|
78
|
+
title_align="left",
|
|
79
|
+
border_style="#D97757",
|
|
80
|
+
padding=(1, 1),
|
|
63
81
|
)
|
|
64
|
-
|
|
82
|
+
|
|
83
|
+
console.print(header_panel)
|
|
84
|
+
console.print(f"[bold #D97757]│[/bold #D97757] [bold #D97757]⚡ Claude 3.7 & Gemini 3.7 are live![/bold #D97757] [dim]Type [bold white]:models[/bold white] to switch models · [bold white]:doctor[/bold white] for diagnostics[/dim]\n")
|
|
65
85
|
|
|
66
86
|
if recommendations:
|
|
67
87
|
console.print("[dim italic]💡 Try asking:[/dim italic]")
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dbagent-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.8.0"
|
|
8
8
|
description = "Enterprise AI Database Copilot, Schema Graph Introspector & Autonomous Recovery Agent (CLI)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
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
|
|
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
|