dbagent-cli 0.8.8__tar.gz → 0.8.9__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.8.8 → dbagent_cli-0.8.9}/PKG-INFO +1 -1
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/__init__.py +1 -1
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/agent/pipeline.py +8 -7
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/connectors/relational.py +66 -24
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent_cli.egg-info/PKG-INFO +1 -1
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/pyproject.toml +1 -1
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/README.md +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/agent/confidence.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/agent/conversation.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/agent/doctor.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/agent/error_classifier.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/agent/generator.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/agent/recommender.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/agent/validator.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/cli.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/config.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/connectors/base.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/connectors/factory.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/connectors/mongo.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/execution/__init__.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/execution/cache.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/execution/changeset.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/execution/cost.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/execution/recovery.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/execution/sandbox.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/execution/streaming.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/anthropic_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/auto_setup.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/base.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/deepseek_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/factory.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/gemini_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/groq_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/mistral_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/mock_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/ollama_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/openai_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/llm/openrouter_provider.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/schema/cache.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/schema/formatter.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/schema/graph.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/schema/models.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/schema/retriever.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/schema/selector.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/security/__init__.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/security/audit.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/security/environment.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/security/masking.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/security/modes.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/security/rbac.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/semantic/__init__.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/semantic/dictionary.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/semantic/templates.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/sql/__init__.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/sql/optimizer.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/sql/validator.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/ui/chat_screen.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/ui/console.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/ui/grid_window.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/ui/viewer.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent/ui/visualizer.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent_cli.egg-info/SOURCES.txt +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent_cli.egg-info/dependency_links.txt +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent_cli.egg-info/entry_points.txt +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent_cli.egg-info/requires.txt +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/dbagent_cli.egg-info/top_level.txt +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/setup.cfg +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_cache.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_cli.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_connectors.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_direct_sql.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_doctor_and_viz.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_generator.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_graph.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_providers.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_recovery.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_safety.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_sandbox.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_schema.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_security.py +0 -0
- {dbagent_cli-0.8.8 → dbagent_cli-0.8.9}/tests/test_semantic.py +0 -0
|
@@ -205,16 +205,17 @@ class QueryPipeline:
|
|
|
205
205
|
# --- 1.2. Architectural / Linkage Analysis Path ---
|
|
206
206
|
if result.intent == "analysis":
|
|
207
207
|
try:
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
schema = self.connector.inspect_schema(include_samples=True, max_samples=2)
|
|
208
|
+
try:
|
|
209
|
+
exact, fuzzy = self.connector.resolve_tables(user_prompt)
|
|
210
|
+
except Exception:
|
|
211
|
+
exact, fuzzy = [], []
|
|
213
212
|
|
|
214
|
-
|
|
213
|
+
sub_schema, join_steps = self._get_fast_schema_context(user_prompt, exact, fuzzy)
|
|
214
|
+
result.schema = sub_schema
|
|
215
|
+
result.join_steps = join_steps
|
|
215
216
|
conv_history = self.conversation.format_context_for_prompt()
|
|
216
217
|
result.message = self.generator.generate_analysis_response(
|
|
217
|
-
schema=
|
|
218
|
+
schema=sub_schema,
|
|
218
219
|
user_prompt=user_prompt,
|
|
219
220
|
conversation_history=conv_history,
|
|
220
221
|
model=self.model,
|
|
@@ -200,16 +200,37 @@ class RelationalConnector(BaseConnector):
|
|
|
200
200
|
lower_targets = {t.lower() for t in table_names}
|
|
201
201
|
target_tables = [t for t in all_table_names if t.lower() in lower_targets]
|
|
202
202
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
203
|
+
if len(target_tables) > 1:
|
|
204
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
205
|
+
with ThreadPoolExecutor(max_workers=min(len(target_tables), 8)) as executor:
|
|
206
|
+
futures = [
|
|
207
|
+
executor.submit(
|
|
208
|
+
self._inspect_single_table,
|
|
209
|
+
insp,
|
|
210
|
+
t_name,
|
|
211
|
+
False,
|
|
212
|
+
include_samples,
|
|
213
|
+
max_samples,
|
|
214
|
+
include_row_counts,
|
|
215
|
+
)
|
|
216
|
+
for t_name in target_tables
|
|
217
|
+
]
|
|
218
|
+
for f in futures:
|
|
219
|
+
try:
|
|
220
|
+
tables.append(f.result())
|
|
221
|
+
except Exception:
|
|
222
|
+
pass
|
|
223
|
+
else:
|
|
224
|
+
for t_name in target_tables:
|
|
225
|
+
table_model = self._inspect_single_table(
|
|
226
|
+
insp=insp,
|
|
227
|
+
table_name=t_name,
|
|
228
|
+
is_view=False,
|
|
229
|
+
include_samples=include_samples,
|
|
230
|
+
max_samples=max_samples,
|
|
231
|
+
include_row_counts=include_row_counts,
|
|
232
|
+
)
|
|
233
|
+
tables.append(table_model)
|
|
213
234
|
|
|
214
235
|
# 2. Inspect views
|
|
215
236
|
if include_views:
|
|
@@ -220,20 +241,41 @@ class RelationalConnector(BaseConnector):
|
|
|
220
241
|
lower_targets = {t.lower() for t in table_names}
|
|
221
242
|
target_views = [v for v in all_view_names if v.lower() in lower_targets]
|
|
222
243
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
244
|
+
if len(target_views) > 1:
|
|
245
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
246
|
+
with ThreadPoolExecutor(max_workers=min(len(target_views), 6)) as executor:
|
|
247
|
+
view_futures = [
|
|
248
|
+
executor.submit(
|
|
249
|
+
self._inspect_single_table,
|
|
250
|
+
insp,
|
|
251
|
+
v_name,
|
|
252
|
+
True,
|
|
253
|
+
include_samples,
|
|
254
|
+
max_samples,
|
|
255
|
+
include_row_counts,
|
|
256
|
+
)
|
|
257
|
+
for v_name in target_views
|
|
258
|
+
]
|
|
259
|
+
for f in view_futures:
|
|
260
|
+
try:
|
|
261
|
+
tables.append(f.result())
|
|
262
|
+
except Exception:
|
|
263
|
+
pass
|
|
264
|
+
else:
|
|
265
|
+
for v_name in target_views:
|
|
266
|
+
view_model = self._inspect_single_table(
|
|
267
|
+
insp=insp,
|
|
268
|
+
table_name=v_name,
|
|
269
|
+
is_view=True,
|
|
270
|
+
include_samples=include_samples,
|
|
271
|
+
max_samples=max_samples,
|
|
272
|
+
include_row_counts=include_row_counts,
|
|
273
|
+
)
|
|
274
|
+
try:
|
|
275
|
+
view_model.view_definition = insp.get_view_definition(v_name)
|
|
276
|
+
except Exception:
|
|
277
|
+
pass
|
|
278
|
+
tables.append(view_model)
|
|
237
279
|
|
|
238
280
|
return DatabaseSchema(
|
|
239
281
|
dialect_name=dialect_name,
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dbagent-cli"
|
|
7
|
-
version = "0.8.
|
|
7
|
+
version = "0.8.9"
|
|
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
|