Files
attackerandClaude 92a2247390 feat: 新增 Agent CLI — Web 版 AI 运维 Agent(参考 opsxcli 移植)
后端引擎 backend/pkg/agentcli/(纯引擎库,零业务依赖,剥离 CLI/TUI 外壳):
- llm: OpenAI 兼容客户端,复用 model.LLMConfig
- tools: ssh_execute(复用 pkg/remoteexec)+ analyze_output + 风险评估黑名单
- safety: 三级安全模式 + 五级风险 + WebSocket 异步确认
- prompt: 五层 System Prompt
- core: ReAct 16 轮循环 + 自适应检查点 + 循环检测
- evolver: 四层记忆 + 进化循环,data/agentcli/ 文件存储

集成层:
- controller/agent_cli.go: WebSocket 控制器(事件流推流 + 高危确认 + 会话持久化)
- model/agent_cli.go: agent_cli_sessions/messages 表 + AutoMigrate
- 路由 /ws/agent-cli + /api/v1/aiops/agent-cli/sessions
- seed 权限 aiops:agent-cli / aiops:llm-config

前端:
- AgentCLI.tsx: 对话流 + 工具块 + 高危确认 + 四模块 tips 面板
- LLMConfig.tsx: 大模型设置独立页
- api/agentCli.ts + Sidebar/App 菜单路由

文档:
- docs/agent/ 11 篇(opsxcli 同名文档适配改写 + 00-README 映射总览)

其他:
- CLAUDE.md 补充 agent-cli 模块说明
- 修正 .gitignore 根级二进制规则(前导 /,避免误伤 frontend/src/components/aiops/)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-27 09:55:17 +08:00

90 lines
3.0 KiB
Go
Raw Permalink 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.
// Package safety 提供 Agent CLI 的安全控制层。 // Logan.Li
// 设计参考 opsxcli internal/agent/safety,适配 Web 场景:确认动作改为异步回调
// (由 controller 实现 confirmFn:推送 WS confirm 事件并阻塞等待前端回传)。
// 风险评估逻辑(黑名单 + AssessBashRisk)在 tools 包,本包只做"是否需确认"的策略。
package safety
import (
"ezops/pkg/agentcli/tools"
)
// Mode 安全模式 // Logan.Li
type Mode string
const (
ModeStrict Mode = "strict" // medium+ 需确认
ModeBalanced Mode = "balanced" // high+ 需确认(默认)
ModePermissive Mode = "permissive" // 仅 critical 处理
)
// ConfirmFn 确认回调:由 controller 实现,返回用户是否批准执行。 // Logan.Li
// risk 为动态评估的风险等级,args 为工具参数(含具体 command),供前端展示。
type ConfirmFn func(toolName string, args map[string]interface{}, risk tools.RiskLevel) (bool, error)
// Controller 安全控制器 // Logan.Li
type Controller struct {
mode Mode
confirmFn ConfirmFn
autoApprove bool // 测试用:自动批准(危险,生产禁用)
}
// NewController 创建安全控制器 // Logan.Li
func NewController(mode Mode) *Controller {
if mode == "" {
mode = ModeBalanced
}
return &Controller{mode: mode}
}
// SetConfirmFn 注入确认回调 // Logan.Li
func (c *Controller) SetConfirmFn(fn ConfirmFn) { c.confirmFn = fn }
// SetAutoApprove 设置自动批准(仅测试) // Logan.Li
func (c *Controller) SetAutoApprove(b bool) { c.autoApprove = b }
// riskThreshold 各模式下的确认阈值 // Logan.Li
func (c *Controller) riskThreshold() tools.RiskLevel {
switch c.mode {
case ModeStrict:
return tools.RiskMedium
case ModePermissive:
return tools.RiskCritical
default:
return tools.RiskHigh
}
}
// Check 执行前安全检查,返回是否允许执行。 // Logan.Li
// 策略:
// 1. 命中危险命令黑名单(Critical)→ 直接拒绝(硬红线,不可确认放行)。
// 2. 按模式阈值,达到等级 → 调 confirmFn 请用户确认。
// 3. AutoApprove → 跳过确认。
func (c *Controller) Check(tool tools.Tool, args map[string]interface{}) (bool, error) {
risk := assessToolRisk(tool, args)
// 黑名单硬红线:rm -rf /、mkfs 等绝不允许
if risk >= tools.RiskCritical {
return false, nil
}
// 未达阈值或自动批准:直接放行
if c.autoApprove || risk < c.riskThreshold() {
return true, nil
}
// 达到阈值:请求用户确认
if c.confirmFn == nil {
// 无确认回调时,保守拒绝(Web 场景应始终注入 confirmFn)
return false, nil
}
return c.confirmFn(tool.Name(), args, risk)
}
// assessToolRisk 取工具实际风险:优先动态评估(ssh_execute 看命令),否则静态。 // Logan.Li
func assessToolRisk(tool tools.Tool, args map[string]interface{}) tools.RiskLevel {
if dt, ok := tool.(tools.DynamicRiskTool); ok {
return dt.RiskLevelForArgs(args)
}
return tool.RiskLevel()
}