Files
GoClaw/todo.md
Manus 0dcae37a78 Checkpoint: Phase 12: Real-time Docker Swarm monitoring for /nodes page
Реализовано:
- gateway/internal/docker/client.go: Docker API клиент через unix socket (/var/run/docker.sock)
  - IsSwarmActive(), GetSwarmInfo(), ListNodes(), ListContainers(), GetContainerStats()
  - CalcCPUPercent() для расчёта CPU%
- gateway/internal/api/handlers.go: новые endpoints
  - GET /api/nodes: список Swarm нод или standalone Docker хост
  - GET /api/nodes/stats: live CPU/RAM статистика контейнеров
  - POST /api/tools/execute: выполнение инструментов
- gateway/cmd/gateway/main.go: зарегистрированы новые маршруты
- server/gateway-proxy.ts: добавлены getGatewayNodes() и getGatewayNodeStats()
- server/routers.ts: добавлен nodes router (nodes.list, nodes.stats)
- client/src/pages/Nodes.tsx: полностью переписан на реальные данные
  - Auto-refresh: 10s для нод, 15s для статистики контейнеров
  - Swarm mode: показывает все ноды кластера
  - Standalone mode: показывает локальный Docker хост + контейнеры
  - CPU/RAM gauges из реальных docker stats
  - Error state при недоступном Gateway
  - Loading skeleton
- server/nodes.test.ts: 14 новых vitest тестов
- Все 51 тест пройдены
2026-03-20 20:12:57 -04:00

177 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GoClaw Control Center TODO
- [x] Basic Dashboard layout (Mission Control theme)
- [x] Agents page with mock data
- [x] Nodes page with mock data
- [x] Chat page with mock conversation
- [x] Settings page with provider cards
- [x] Docker Stack integration
- [x] Fix Home.tsx conflict after upgrade
- [x] Fix DashboardLayout.tsx conflict after upgrade
- [x] Create server-side Ollama API proxy routes (tRPC)
- [x] Integrate real Ollama /v1/models endpoint in Settings
- [x] Integrate real Ollama /v1/chat/completions in Chat page
- [x] Add OLLAMA_API_KEY and OLLAMA_BASE_URL secrets
- [x] Write vitest tests for Ollama API proxy
- [x] Update Dashboard with real model data
- [ ] Add streaming support for chat responses
- [ ] Connect real Docker Swarm API for node monitoring
- [ ] Add authentication/login protection
## Phase 1: Agent Management UI
- [x] Connect Agents page to trpc.agents.list (load real agents from DB)
- [x] Create AgentDetailModal component for viewing agent config
- [x] Create AgentCreateModal component with form validation
- [x] Implement agent update mutation (model, temperature, maxTokens, systemPrompt)
- [x] Implement agent delete mutation with confirmation
- [x] Add start/pause/restart actions for agents
- [x] Add agent metrics chart (requests, tokens, processing time)
- [x] Add agent history view (recent requests/responses)
- [x] Write vitest tests for agent management components
## Phase 2: Tool Binding System
- [x] Design Tool Binding API schema
- [x] Create tool registry in database
- [x] Implement tool execution sandbox
- [x] Add tool access control per agent
- [x] Create UI for tool management
## Phase 3: Tool Integration
- [x] Implement Browser tool (HTTP fetch-based)
- [x] Implement Shell tool (bash execution with safety checks)
- [x] Implement File tool (read/write with path restrictions)
- [x] Implement Docker tool (container management)
- [x] Implement HTTP tool (GET/POST with domain whitelist)
## Phase 4: Metrics & History
- [x] AgentMetrics page with request timeline chart
- [x] Conversation history log per agent
- [x] Raw metrics table with token/time data
- [x] Stats cards (total requests, success rate, avg response time, tokens)
- [x] Time range selector (6h/24h/48h/7d)
- [x] Metrics button on agent cards
- [x] Navigation: /agents/:id/metrics route
- [x] Tools page added to sidebar navigation
## Phase 5: Specialized Agents
### Browser Agent
- [ ] Install puppeteer-core + chromium dependencies
- [ ] Create server/browser-agent.ts — Puppeteer session manager
- [ ] tRPC routes: browser.start, browser.navigate, browser.screenshot, browser.click, browser.type, browser.extract, browser.close
- [ ] BrowserAgent.tsx page — live browser control UI with screenshot preview
- [ ] Session management: multiple concurrent browser sessions per agent
- [ ] Add browser_agent to agents DB as pre-seeded entry
### Tool Builder Agent
- [ ] Create server/tool-builder.ts — LLM-powered tool generator
- [ ] tRPC routes: toolBuilder.generate, toolBuilder.validate, toolBuilder.install
- [ ] Dynamic tool registration: add generated tools to TOOL_REGISTRY at runtime
- [ ] Persist custom tools to DB (tool_definitions table)
- [ ] ToolBuilder.tsx page — describe tool → preview code → install
- [ ] Add tool_builder_agent to agents DB as pre-seeded entry
### Agent Compiler
- [ ] Create server/agent-compiler.ts — LLM-powered agent factory
- [ ] tRPC routes: agentCompiler.compile, agentCompiler.preview, agentCompiler.deploy
- [ ] AgentCompiler.tsx page — ТЗ input → agent config preview → deploy
- [ ] Auto-populate: model, role, systemPrompt, allowedTools from ТЗ
- [ ] Add agent_compiler to agents DB as pre-seeded entry
### Integration
- [ ] Add all 3 pages to sidebar navigation
- [ ] Write vitest tests for all new server modules
- [ ] Push to Gitea (NW)
## Phase 6: Agents as Real Chat Entities
- [ ] Remove unused pages: BrowserAgent.tsx, ToolBuilder.tsx, AgentCompiler.tsx
- [ ] Seed 3 agents into DB: Browser Agent, Tool Builder Agent, Agent Compiler
- [ ] Add tRPC chat endpoint: agents.chat (LLM + tool execution per agent)
- [ ] Update Chat UI to support agent selection dropdown
- [ ] Create /skills page — skills registry with install/uninstall
- [ ] Update /agents to show seeded agents with Chat button
- [ ] Update /tools to show tools per agent with filter by agent
- [ ] Add /skills to sidebar navigation
- [ ] Write tests for chat and skills endpoints
## Phase 6: Orchestrator Agent (Main Chat)
- [x] Fix TS errors: browserSessions/toolDefinitions schema exports, z.record
- [x] Seed 3 specialized agents into DB (Browser, Tool Builder, Agent Compiler)
- [x] Create server/orchestrator.ts — main orchestrator with tool-use loop
- [x] Orchestrator tools: shell_exec, file_read, file_write, http_request, delegate_to_agent, list_agents, list_skills, install_skill
- [x] Add trpc.orchestrator.chat mutation (multi-step tool-use loop with LLM)
- [x] Update /chat UI: show tool call steps, agent delegation, streaming response
- [x] Create /skills page with skill registry (install/remove/describe)
- [x] Add /skills to sidebar navigation
- [x] Update /agents to show seeded agents with Chat button
- [ ] Write tests for orchestrator
## Phase 7: Orchestrator as Configurable System Agent
- [x] Add isSystem + isOrchestrator fields to agents table (DB migration)
- [x] Seed Orchestrator as system agent in DB (role=orchestrator, isSystem=true)
- [x] Update orchestrator.ts to load model/systemPrompt/allowedTools from DB
- [x] Update /chat to read orchestrator config from DB, show active model in header
- [x] Update /agents to show Orchestrator with SYSTEM badge, Configure button, no delete
- [x] AgentDetailModal: orchestrator gets extra tab with system tools (shell, docker, agents mgmt)
- [x] Add system tools to orchestrator: docker_ps, docker_restart, manage_agents, read_logs
- [x] /chat header: show current model name + link to Configure Orchestrator
## Phase 8: Fix Orchestrator Chat
- [x] Fix: orchestrator uses model from DB config (minimax-m2.7, not hardcoded fallback)
- [x] Fix: real tool-use loop — execute shell_exec, file_read, file_list tools
- [x] Fix: show tool call steps in Chat UI (tool name, args, result, duration)
- [x] Fix: Chat.tsx shows which model is being used from orchestrator config
- [x] Fix: Streamdown markdown rendering for assistant responses
- [ ] Add: streaming/SSE for real-time response display
## Phase 9: Go Gateway Migration (Variant C)
- [x] Create gateway/ directory with Go module (git.softuniq.eu/UniqAI/GoClaw/gateway)
- [x] Implement config/config.go — env-based configuration
- [x] Implement internal/llm/client.go — Ollama API client (chat, models, health)
- [x] Implement internal/db/db.go — MySQL connection, agent/config queries
- [x] Implement internal/tools/executor.go — Tool Executor (shell_exec, file_read, file_write, file_list, http_request, docker_exec, list_agents)
- [x] Implement internal/orchestrator/orchestrator.go — LLM tool-use loop, config from DB
- [x] Implement internal/api/handlers.go — REST API handlers
- [x] Implement cmd/gateway/main.go — HTTP server with chi router, graceful shutdown
- [x] Go Gateway compiles successfully (10.8MB binary)
- [x] Create server/gateway-proxy.ts — Node.js proxy client to Go Gateway
- [x] Create docker/docker-compose.yml — local dev (control-center + gateway + ollama + db)
- [x] Create docker/docker-stack.yml — Docker Swarm production (2 replicas, rolling updates)
- [x] Create docker/Dockerfile.gateway — multi-stage Go build
- [x] Create docker/Dockerfile.control-center — multi-stage Node.js build
- [ ] Update server/routers.ts: replace orchestrator.ts calls with gateway-proxy.ts calls
- [ ] Write Go unit tests (gateway/internal/tools/executor_test.go)
- [ ] Write Go integration test for orchestrator chat loop
- [ ] Push to Gitea (NW)
## Phase 10: LLM Provider Configuration
- [x] config.go: default LLM_BASE_URL = https://ollama.com/v1 (Ollama Cloud)
- [x] config.go: support LLM_BASE_URL + LLM_API_KEY env vars (legacy OLLAMA_* aliases kept)
- [x] config.go: normaliseLLMURL() — auto-append /v1 for bare Ollama hosts
- [x] docker-compose.yml: ollama service commented out (GPU only), LLM_BASE_URL/LLM_API_KEY added
- [x] docker-stack.yml: ollama service commented out (GPU only), llm-api-key secret added
- [x] docker/.env.example: 4 LLM provider options documented (Ollama Cloud, OpenAI, Groq, Local GPU)
## Phase 11: Frontend → Go Gateway Integration
- [x] gateway-proxy.ts: fix getGatewayTools() — map OpenAI format {type,function:{name,...}} to GatewayToolDef
- [x] gateway-proxy.ts: add executeGatewayTool(), getGatewayAgent(), isGatewayAvailable() methods
- [x] routers.ts: orchestrator.getConfig — Go Gateway first, Node.js fallback
- [x] routers.ts: orchestrator.chat — Go Gateway first, Node.js fallback
- [x] routers.ts: orchestrator.tools — Go Gateway first, Node.js fallback
- [x] routers.ts: orchestrator.gatewayHealth — new endpoint for UI status
- [x] routers.ts: ollama.health — Go Gateway first, direct Ollama fallback
- [x] routers.ts: ollama.models — Go Gateway first, direct Ollama fallback
- [x] gateway/db.go: TLS auto-detection for TiDB Cloud (tidbcloud/aws/gcp/azure hosts)
- [x] server/gateway-proxy.test.ts: 13 vitest tests (health, config, tools, mapping)
- [x] End-to-end test: orchestrator.chat via tRPC → Go Gateway → Ollama (source: "gateway")
- [x] End-to-end test: tool calling — file_list tool executed by Go Gateway
## Phase 12: Real-time Nodes Page
- [ ] Add Docker API client in Go Gateway: /api/nodes endpoint with real node data
- [ ] Add /api/nodes/stats endpoint for CPU/memory per node
- [ ] Add tRPC nodes.list and nodes.stats procedures via gateway-proxy
- [ ] Update Nodes.tsx: real data from tRPC + auto-refresh every 5 seconds
- [ ] Show: node ID, hostname, status, role (manager/worker), availability, CPU, RAM, Docker version, IP
- [ ] Show live indicator (green pulse) when data is fresh
- [ ] Deploy to server 2.59.219.61