feat(agent-chat): 035-agent-chat-context — контекст, guardrails, tools, database discovery

== User stories ==
US1: Контекст с дашборда/датасета → /agent с URL params
US2: Guardrails card — env badge, 7 risk tones, countdown, permission_denied
US3: Tools optimization — retry, timeout, summarise, RBAC + context affinity

== Backend ==
- _context.py (NEW): UIContext validation (7 checks)
- _tool_filter.py (NEW): RBAC + context affinity pipeline
- _confirmation.py: build_confirmation_contract_v2, permission_denied_payload
- tools.py: superset_list_databases, retry/summarise/timeout wrappers
- app.py: _inject_uicontext, _inject_env_id_into_tools, database
  prefetch в runtime context
- _persistence.py: prefetch_databases()
- agent_superset_explore.py: GET /databases endpoint
- _llm_async_http.py, _persistence.py: fix double /v1 в LLM URL
  (LM Studio Unexpected endpoint)

== Frontend ==
- AgentChatModel.svelte.ts: 5 atoms, 3 actions, countdown, context
- AgentChat.svelte: production banner, process steps, debug panel
- ConfirmationCard.svelte: 7 risk tones, permission_denied, countdown
- ToolCallCard.svelte: retrying/timeout/cancelled states
- StreamProcessor.svelte.ts: tool_retry, timeout, permission_denied
- TopNavbar: sparkles icon + Ассистент
- sidebarNavigation: AI section
- DashboardHeader, datasets/+page: contextual AI buttons
- Icon: sparkles, brain, cpu icons
- tailwind: assistant category colors
- i18n: en/ru nav keys

== Tests ==
- 159 backend agent tests (+16 US3: retry, timeout, summarise, contracts)
- 2544 frontend tests (+11 model + component tests)
- 15 JSON fixtures (10 API + 5 model)

== Specs ==
- specs/035-agent-chat-context/: spec, UX, plan, tasks, research,
  data-model, contracts, quickstart, traceability, fixtures, checklists

Closes #035
This commit is contained in:
2026-07-04 22:47:17 +03:00
parent 4c5fde8b5c
commit ff60865183
82 changed files with 5168 additions and 553 deletions

View File

@@ -29,6 +29,24 @@ async def _get_superset_client(environment_id: str) -> SupersetClient:
# Databases — Read-only (schema/table exploration)
# ═══════════════════════════════════════════════════════════════════
# #region AgentSuperset.DatabaseList [C:2] [TYPE Endpoint] [SEMANTICS api,agent,database,list]
# @ingroup Api
# @BRIEF List all databases available in the environment.
# @SIDE_EFFECT HTTP GET to Superset /api/v1/database/.
# @RELATION CALLS -> [SupersetClientGetDatabasesSummary]
@router.get("/databases")
async def agent_list_databases(
environment_id: str = Query(...),
) -> list:
"""List all databases with id, name, uuid, and engine for the given environment."""
client = await _get_superset_client(environment_id)
try:
return await client.get_databases_summary()
finally:
await client.aclose()
# #endregion AgentSuperset.DatabaseList
# #region AgentSuperset.DatabaseSchemas [C:2] [TYPE Endpoint] [SEMANTICS api,agent,database,schemas]
# @ingroup Api
# @BRIEF List all schemas for a database.