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.
Files changed (81) hide show
  1. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/PKG-INFO +1 -1
  2. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/__init__.py +1 -1
  3. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/cli.py +21 -3
  4. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/chat_screen.py +46 -26
  5. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/PKG-INFO +1 -1
  6. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/pyproject.toml +1 -1
  7. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/README.md +0 -0
  8. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/confidence.py +0 -0
  9. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/conversation.py +0 -0
  10. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/doctor.py +0 -0
  11. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/error_classifier.py +0 -0
  12. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/generator.py +0 -0
  13. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/pipeline.py +0 -0
  14. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/recommender.py +0 -0
  15. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/agent/validator.py +0 -0
  16. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/config.py +0 -0
  17. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/connectors/base.py +0 -0
  18. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/connectors/factory.py +0 -0
  19. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/connectors/mongo.py +0 -0
  20. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/connectors/relational.py +0 -0
  21. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/__init__.py +0 -0
  22. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/cache.py +0 -0
  23. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/changeset.py +0 -0
  24. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/cost.py +0 -0
  25. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/recovery.py +0 -0
  26. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/sandbox.py +0 -0
  27. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/execution/streaming.py +0 -0
  28. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/anthropic_provider.py +0 -0
  29. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/auto_setup.py +0 -0
  30. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/base.py +0 -0
  31. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/deepseek_provider.py +0 -0
  32. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/factory.py +0 -0
  33. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/gemini_provider.py +0 -0
  34. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/groq_provider.py +0 -0
  35. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/mistral_provider.py +0 -0
  36. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/mock_provider.py +0 -0
  37. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/ollama_provider.py +0 -0
  38. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/openai_provider.py +0 -0
  39. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/llm/openrouter_provider.py +0 -0
  40. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/cache.py +0 -0
  41. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/formatter.py +0 -0
  42. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/graph.py +0 -0
  43. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/models.py +0 -0
  44. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/retriever.py +0 -0
  45. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/schema/selector.py +0 -0
  46. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/__init__.py +0 -0
  47. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/audit.py +0 -0
  48. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/environment.py +0 -0
  49. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/masking.py +0 -0
  50. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/modes.py +0 -0
  51. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/security/rbac.py +0 -0
  52. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/semantic/__init__.py +0 -0
  53. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/semantic/dictionary.py +0 -0
  54. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/semantic/templates.py +0 -0
  55. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/sql/__init__.py +0 -0
  56. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/sql/optimizer.py +0 -0
  57. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/sql/validator.py +0 -0
  58. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/console.py +0 -0
  59. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/grid_window.py +0 -0
  60. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/viewer.py +0 -0
  61. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent/ui/visualizer.py +0 -0
  62. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/SOURCES.txt +0 -0
  63. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/dependency_links.txt +0 -0
  64. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/entry_points.txt +0 -0
  65. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/requires.txt +0 -0
  66. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/dbagent_cli.egg-info/top_level.txt +0 -0
  67. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/setup.cfg +0 -0
  68. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_cache.py +0 -0
  69. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_cli.py +0 -0
  70. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_connectors.py +0 -0
  71. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_direct_sql.py +0 -0
  72. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_doctor_and_viz.py +0 -0
  73. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_generator.py +0 -0
  74. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_graph.py +0 -0
  75. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_providers.py +0 -0
  76. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_recovery.py +0 -0
  77. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_safety.py +0 -0
  78. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_sandbox.py +0 -0
  79. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_schema.py +0 -0
  80. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_security.py +0 -0
  81. {dbagent_cli-0.7.2 → dbagent_cli-0.8.0}/tests/test_semantic.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbagent-cli
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: Enterprise AI Database Copilot, Schema Graph Introspector & Autonomous Recovery Agent (CLI)
5
5
  Author: Santhosh Gupta
6
6
  Requires-Python: >=3.9
@@ -2,5 +2,5 @@
2
2
  DB-Agent: Universal Database Introspection and Script Generation AI Agent (CLI).
3
3
  """
4
4
 
5
- __version__ = "0.7.2"
5
+ __version__ = "0.8.0"
6
6
  __author__ = "Santhosh Gupta"
@@ -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(HTML("<ansicyan><b>db-agent</b></ansicyan> <ansiblue><b>❯</b></ansiblue> ")).strip()
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 top Claude-style status header card."""
39
- model_str = f" ({ai_model})" if ai_model else ""
40
-
41
- header_content = Text()
42
- header_content.append("⚡ DB-AGENT ", style="bold cyan")
43
- header_content.append(f"v{__version__}\n", style="bold green")
44
-
45
- header_content.append("🟢 Connected: ", style="bold green")
46
- header_content.append(f"{db_name} ", style="bold white")
47
- header_content.append(f"({dialect}) • {table_count} tables\n", style="dim")
48
-
49
- header_content.append("🤖 AI: ", style="bold cyan")
50
- header_content.append(f"{ai_provider}{model_str}", style="bold white")
51
- header_content.append(" | ", style="dim")
52
- header_content.append("🛡️ Mode: ", style="bold yellow")
53
- header_content.append(f"{mode}", style="bold yellow")
54
- header_content.append(" | ", style="dim")
55
- header_content.append("⌨️ Type ", style="dim")
56
- header_content.append(":help", style="bold cyan")
57
- header_content.append(" for commands", style="dim")
58
-
59
- panel = Panel(
60
- header_content,
61
- border_style="cyan",
62
- padding=(0, 1),
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
- console.print(panel)
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]")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbagent-cli
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: Enterprise AI Database Copilot, Schema Graph Introspector & Autonomous Recovery Agent (CLI)
5
5
  Author: Santhosh Gupta
6
6
  Requires-Python: >=3.9
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dbagent-cli"
7
- version = "0.7.2"
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