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>
This commit is contained in:
1 parent
f2069fe3f0
commit
92a2247390
37 files changed
+6449
-6
No files matched your search
@@ -0,0 +1,89 @@
|
||||
// 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()
|
||||
}
|
||||
Reference in new issue
Block a user