feat: 新增工具插件、系统日志、workflow配置及前端优化

1. 新增工具插件(edit_file, python_executor, search_file, shell_executor, write_file)
2. 新增系统事件日志模块和API
3. 新增workflow配置文件和详情API
4. 前端增加SSE、错误边界、设置引导等组件
5. 优化认证加密、速率限制、配置加载等工具模块
6. 删除废弃的cluster和health API
7. 补充单元测试和集成测试

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-03 07:34:43 +00:00
parent f04fef916f
commit a53ffebe0e
57 changed files with 2804 additions and 271 deletions
+45
View File
@@ -0,0 +1,45 @@
import time
from collections import defaultdict
from typing import Dict, Tuple
from fastapi import HTTPException, Request
class InMemoryRateLimiter:
"""基于滑动窗口的内存限流器。
按 IP 地址追踪请求次数,超出阈值时抛出 429。
适用于单实例部署;集群部署应替换为 Redis 后端。
"""
def __init__(self, max_requests: int = 5, window_seconds: int = 60):
self._max_requests = max_requests
self._window_seconds = window_seconds
self._requests: Dict[str, list[float]] = defaultdict(list)
def _get_client_ip(self, request: Request) -> str:
forwarded = request.headers.get("X-Forwarded-For")
if forwarded:
return forwarded.split(",")[0].strip()
return request.client.host if request.client else "unknown"
def _cleanup(self, key: str, now: float) -> None:
cutoff = now - self._window_seconds
self._requests[key] = [
t for t in self._requests[key] if t > cutoff
]
def check(self, request: Request) -> None:
now = time.time()
key = self._get_client_ip(request)
self._cleanup(key, now)
if len(self._requests[key]) >= self._max_requests:
raise HTTPException(
status_code=429,
detail="请求过于频繁,请稍后再试",
)
self._requests[key].append(now)
register_limiter = InMemoryRateLimiter(max_requests=5, window_seconds=60)
login_limiter = InMemoryRateLimiter(max_requests=10, window_seconds=60)