dbagent-cli 0.7.2__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.2 → dbagent_cli-0.8.0}/PKG-INFO +1 -1
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/__init__.py +1 -1
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/cli.py +21 -3
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/chat_screen.py +46 -26
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/PKG-INFO +1 -1
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/pyproject.toml +1 -1
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/README.md +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/confidence.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/conversation.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/doctor.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/error_classifier.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/generator.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/pipeline.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/recommender.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/validator.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/config.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/connectors/base.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/connectors/factory.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/connectors/mongo.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/connectors/relational.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/__init__.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/cache.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/changeset.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/cost.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/recovery.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/sandbox.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/streaming.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/anthropic_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/auto_setup.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/base.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/deepseek_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/factory.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/gemini_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/groq_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/mistral_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/mock_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/ollama_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/openai_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/openrouter_provider.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/cache.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/formatter.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/graph.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/models.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/retriever.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/selector.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/__init__.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/audit.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/environment.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/masking.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/modes.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/rbac.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/semantic/__init__.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/semantic/dictionary.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/semantic/templates.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/sql/__init__.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/sql/optimizer.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/sql/validator.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/console.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/grid_window.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/viewer.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/visualizer.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/SOURCES.txt +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/dependency_links.txt +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/entry_points.txt +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/requires.txt +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/top_level.txt +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/setup.cfg +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_cache.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_cli.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_connectors.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_direct_sql.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_doctor_and_viz.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_generator.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_graph.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_providers.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_recovery.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_safety.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_sandbox.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_schema.py +0 -0
- {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_security.py +0 -0
- {dbagent_cli-0.7.2 → 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
|
|
@@ -505,9 +512,22 @@ def chat_command(
|
|
|
505
512
|
conversation_context=conversation_ctx,
|
|
506
513
|
)
|
|
507
514
|
|
|
515
|
+
def _get_bottom_toolbar():
|
|
516
|
+
curr_model = model or getattr(llm, "default_model", "default")
|
|
517
|
+
return HTML(
|
|
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> │ "
|
|
520
|
+
f"<b><ansiyellow>🛡️ {current_mode.value}</ansiyellow></b> │ "
|
|
521
|
+
f"<ansidarkgray><b>:help</b> for commands · <b>:models</b> to switch</ansidarkgray> "
|
|
522
|
+
)
|
|
523
|
+
|
|
508
524
|
while True:
|
|
509
525
|
try:
|
|
510
|
-
user_input = session.prompt(
|
|
526
|
+
user_input = session.prompt(
|
|
527
|
+
HTML("<ansired><b>❯</b></ansired> "),
|
|
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>"),
|
|
530
|
+
).strip()
|
|
511
531
|
if not user_input:
|
|
512
532
|
continue
|
|
513
533
|
|
|
@@ -909,8 +929,6 @@ def chat_command(
|
|
|
909
929
|
pipeline.mode = current_mode
|
|
910
930
|
pipeline.auto_execute = auto_execute
|
|
911
931
|
|
|
912
|
-
render_user_turn(user_input)
|
|
913
|
-
|
|
914
932
|
with DynamicSpinner():
|
|
915
933
|
result = pipeline.run(user_prompt=user_input)
|
|
916
934
|
|
|
@@ -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
|