Commit Graph
939 Commits
Author SHA1 Message Date
t8y2 c6e50f80f2 fix(ai): accept thinking/reasoning deltas as first stream chunk in connection test 2026-06-12 20:40:40 +08:00
t8y2 a7ba5b42ef chore: remove duplicate imports and BOM from PR #1122 2026-06-12 19:58:32 +08:00
skyler abacac3c07 feat(ai): agent loop Phase 2 — SQL execution tools, risk classification, and streaming tool calls
feat(ai): agent loop Phase 2 — SQL execution tools, risk classification, and streaming tool calls
2026-06-12 19:56:36 +08:00
t8y2 484658c6b7 feat(ai): streaming probe for connection test with latency measurement 2026-06-12 19:29:55 +08:00
runstone 40f0f98540 Merge branch 'main' of https://github.com/Abeautifulsnow/dbx into feat/ai-agent-loop-phase1 2026-06-12 18:52:05 +08:00
runstone 100124da3e feat(ai): Phase 2 SQL 风险分类 + Agent 模式工具调用结果渲染
后端:
  - 新增 sql_risk.rs:基于 sqlparser AST 的 SQL 风险分类(ReadOnly/Write/Ddl/Transaction)
  - agent_tools.rs:新增 execute_query 和 get_sample_data 工具,写操作/DDL 被风险分类阻止
  - agent_loop.rs:支持 is_agent_mode 参数,Agent 模式下暴露全部工具,Ask 模式仅暴露只读工具
  - agent_loop/web/tauri:mode 参数全链路传递(前端→HTTP→Tauri→Rust)

  前端:
  - AiAgentStepItem 接口扩展:toolName/toolArgs/toolResult/isError 字段
  - AiAssistant.vue:工具调用结果实时+最终渲染,SQL 查询结果/错误信息展示
  - ai.ts/http.ts/tauri.ts:mode 参数透传到后端
2026-06-12 17:42:23 +08:00
t8y2 115b539758 fix(core): gate duckdb schema metadata 2026-06-12 17:35:56 +08:00
t8y2 0fdff98200 fix(elasticsearch): route rest queries before sql parsing 2026-06-12 17:15:25 +08:00
polempandSam ef5ed05ae7 feat(schema-diff): professional DDL diff view with deployment-aware colors and custom themes (#1112)
Co-authored-by: Sam <14344444@@qq.com>
2026-06-12 17:14:05 +08:00
t8y2 2554ed95be fix(postgres): clear statement cache after ddl 2026-06-12 17:11:37 +08:00
t8y2 250da6e7cb fix(mysql): generate index COMMENT clause and enable index_comment capability 2026-06-12 16:56:20 +08:00
t8y2 edf9dd88e3 feat(agent): unify oracle driver 2026-06-12 16:34:42 +08:00
t8y2 415d53e8dc fix(duckdb): interrupt timed out queries 2026-06-12 16:27:33 +08:00
t8y2 2395727b6b fix(ai): auto-add /v1 prefix for bare-origin OpenAI-compatible endpoints 2026-06-12 16:10:42 +08:00
t8y2 e6db09c638 feat(agent): support language-neutral driver launch 2026-06-12 15:08:31 +08:00
Abeautifulsnow 082e3bb4eb feat(ai): add agent tool calling loop 2026-06-12 13:18:36 +08:00
runstone 84a9fd6a0f Merge branch 'main' of https://github.com/Abeautifulsnow/dbx into feat/ai-agent-loop-phase1 2026-06-12 12:52:03 +08:00
runstone 28fc4bc2a9 fix(ai): consolidate consecutive tool_result messages for Claude and Gemini
Anthropic and Gemini APIs require ALL tool_result blocks for a given
assistant message to be in a SINGLE user message that immediately follows
the assistant message. Previously, each tool AiMessage was converted to
a separate user message, causing Anthropic to reject multi-turn tool
conversations with 'tool_result must follow a tool_use block' error.

Fix: collect consecutive 'tool' role messages into a buffer, then flush
as a single user message with all tool_result/functionResponse blocks
when a non-tool message is encountered or at end of message list.

- Claude: merge N tool results into 1 user message with N content blocks
- Gemini: merge N tool results into 1 user message with N functionResponse parts
- OpenAI path unchanged (each tool message already has tool_call_id field)
2026-06-12 12:49:49 +08:00
t8y2 b06f935050 chore(release): bump version to 0.5.32 2026-06-12 12:33:03 +08:00
t8y2 a858a6bd18 feat(mysql): edit foreign keys and triggers 2026-06-12 12:29:46 +08:00
t8y2 1d2d348dd8 fix(db): refresh stale native connection pools 2026-06-12 12:29:35 +08:00
runstone 453169ae45 Merge branch 'main' of https://github.com/Abeautifulsnow/dbx into feat/ai-agent-loop-phase1 2026-06-12 12:00:47 +08:00
runstone 61b5e907ce fix(schema): default to public schema for PG and database for MySQL when schema is empty
When the LLM calls `list_tables` tool without a `schema` parameter, the
  backend receives an empty string. This caused PostgreSQL and MySQL
  metadata queries to return no results because:

  - PostgreSQL: `WHERE n.nspname = ''` matches nothing
  - MySQL: `WHERE TABLE_SCHEMA = ''` matches nothing

  Fix by falling back to sensible defaults:
  - PostgreSQL `list_tables`/`get_columns`: empty schema → "public"
  - MySQL `list_tables`: empty schema → database name (MySQL schema == database)
2026-06-12 12:00:27 +08:00
t8y2 bb2768a62f fix(db): update Oracle and OceanBase agent URLs 2026-06-12 11:52:38 +08:00
runstone 2d75667b9a feat(ai): upgrade agent loop tool calling to true SSE streaming
Move tool calling from non-streaming (complete) API calls to real
streaming SSE, so text, reasoning, and tool call arguments all arrive
incrementally — users see the AI think and act in real time.

- Extract ~370 lines of non-streaming tool-call functions from
  agent_loop.rs (call_with_tools, call_openai_with_tools,
  call_claude_with_tools, call_gemini_with_tools) and replace with
  a single ai::stream_with_tools() dispatch call.

- Add streaming-with-tools infrastructure to ai.rs (~550 lines):
  - StreamToolEvent enum: Chunk, ToolCallStart, ToolCallDelta,
    ToolCallComplete — provider-agnostic, feeds into the
    StreamingToolCallAccumulator
  - stream_claude_with_tools(): parse SSE content_block_start/delta/
    stop events, incremental input_json_delta for tool arguments
  - stream_openai_with_tools(): parse SSE delta.tool_calls with
    incremental function.arguments
  - stream_gemini_with_tools(): parse SSE functionCall (Gemini
    sends complete objects, not deltas — emit as one chunk)
  - Cancellation support via tokio::select! in every streaming loop
  - Extended timeout for reasoning models (600s vs 120s)

- StreamingToolCallAccumulator: collect partial tool call fragments
  from streaming deltas, then deserialize into complete ToolCall
  objects in index order once the stream ends.
2026-06-12 11:43:09 +08:00
t8y2 a4bd62005b feat(redis): add all search mode 2026-06-12 11:32:56 +08:00
t8y2 4fee45cf8d fix(db): update redis auth and mongo document refresh 2026-06-12 11:11:16 +08:00
t8y2 9574c44d75 fix(sqlserver): skip TOP when SQL already has OFFSET FETCH NEXT 2026-06-12 10:59:24 +08:00
runstone 9939e3191f fix bug 2026-06-12 10:31:15 +08:00
runstone ef1697d8a8 restore ssh_tunnel.rs file 2026-06-12 08:53:54 +08:00
runstone 91f1206783 Merge branch 'main' of https://github.com/Abeautifulsnow/dbx into feat/ai-agent-loop-phase1 2026-06-12 08:48:50 +08:00
t8y2 51e2ef0d1f fix(postgres): support legacy routine metadata 2026-06-12 00:59:52 +08:00
t8y2 b542f89a0b fix(sql): keep oracle plsql blocks together 2026-06-12 00:47:21 +08:00
t8y2 84aafc7a43 fix: pass jdbc_driver_paths and jdbc_driver_class to agent connect params 2026-06-12 00:46:26 +08:00
haipengno1 7de0de2313 实现 Redis 的查询功能 2026-06-12 00:20:17 +08:00
dbin0123 5aa5ed9cee fix(core): 表结构编辑中字段无长度时扩展属性变更不生成 SQL 2026-06-12 00:20:16 +08:00
t8y2 3f7987aa59 fix(table-data): load metadata before initial query 2026-06-11 23:19:45 +08:00
t8y2 57d03c2f08 feat(sidebar): support nested groups 2026-06-11 22:35:00 +08:00
t8y2 70f7b464b7 feat(jdbc): install drivers from Maven bundles 2026-06-11 21:41:37 +08:00
t8y2 9fbafa9a6d fix(elasticsearch): strip metadata fields from writes 2026-06-11 19:44:58 +08:00
t8y2 bd3585f057 fix: draw selected cell left border for first visible column in canvas mode 2026-06-11 19:35:08 +08:00
t8y2 7923f4915e fix(elasticsearch): apply document filters in browser 2026-06-11 18:56:38 +08:00
runstone 9ab41795d6 @
feat(ai): add agent loop with tool calling, fix connection routing and Gemini compatibility

## 背景说明
将 dbx AI 助手从单次 SQL 文本生成器升级为具备 tool calling 的数据库 Agent。
Phase 1 实现 Agent Loop 框架 + 只读工具(list_tables、get_columns)。
参考:Pi agent-core,.trellis/tasks/06-11-feat-ai-agent-loop-tool-calling-upgrade

## 修改内容
- 新增 agent_loop.rs:Agent Loop 核心,支持 OpenAI/Claude/Gemini Provider 的 tool calling,最大 10 轮,Ollama 自动降级为 text-only
- 新增 agent_tools.rs:read_only_tools (list_tables, get_columns) 的工具定义与执行器
- 新增 agent_events.rs:AgentEvent/ToolCall/ToolResult/ToolDefinition 类型定义
- 修改 ai.rs:AiMessage 新增 tool_call_id 字段
- 修改 lib.rs:注册 agent_events、agent_loop、agent_tools 模块
- 修改 routes/ai.rs & commands/ai.rs:新增 ai_agent_stream SSE 端点
- 修改 tauri.ts & http.ts:新增 AgentEvent 类型与 aiAgentStream 函数
- 修改 api.ts:注册 aiAgentStream 转发
- 修改 ai.ts:新增 runAgentStream,AiContext 增加 connectionId 字段
- 修改 AiAssistant.vue:接入 runAgentStream,解析 AgentEvent 渲染工具调用步骤
- 修改 en.ts / zh-CN.ts:新增 agentSteps 国际化文案

## 修复的问题
- [#I01] connectionName 误传为 connectionId → add connectionId to AiContext
- [#I02] agent loop 取消操作无效 → add cancel checks before each turn
- [#C01] TODO 缺少 issue 引用 → add PRD reference to TODO
- [#C02] stream_with_tools 命名不准确 → add clarifying doc comment
- [#C03] Gemini functionResponse.name 解析错误 → fix tool_call_id format and extraction

## 测试建议
- execute_get_columns:合法表名/空表名/SQL 注入字符拒绝
- call_openai_with_tools:空 choices/空 tool_calls/非 JSON arguments
- call_gemini_with_tools:空 candidates/parts 无 functionCall
- runAgentStream:有效 connectionId 正常调用
@
2026-06-11 18:27:24 +08:00
t8y2 edeee4f7d9 fix(mongo): preserve bson date fields 2026-06-11 18:09:41 +08:00
Doracoin c7c71850d4 fix(windows-build): ssh-agent err when building on windows 2026-06-11 17:29:40 +08:00
t8y2 c10d2d9586 refactor(mysql): extract temporal value serialization, fix DATE display 2026-06-11 14:12:05 +08:00
t8y2 521a3021c4 fix(clickhouse): load table index metadata 2026-06-11 12:23:28 +08:00
t8y2 293df56274 fix(ai): relax connection test token limit 2026-06-11 11:59:23 +08:00
SuLea-IT 5cf736ad96 feat: optimize data compare memory usage
Thanks @SuLea-IT for the contribution! This significantly reduces memory usage (53% lower RSS peak) by avoiding per-row HashMap materialization and cloning. Appreciate the detailed memory audit docs as well.
2026-06-11 11:57:22 +08:00
SuLea-IT 806d7c758b feat: add SQL library history query entry points 2026-06-11 10:53:54 +08:00