dark ab7b839bc6 feat: 新增 PAM 智能部署 Agent 运行时骨架
- 新增 pam_deploy_graph 包,包含 agent、action router、runner、parser 和配置加载能力
- 支持 hybrid_node_mcp 路由策略:PAM_HOME 走脚本 action,PAM_NODE 走 MCP
- 新增 fake runner 和 CLI 预演/全局流程验证入口
- 新增路由、输出解析、配置加载、脚本命令构造、Skill 策略加载测试
- 在 README 中记录当前代码骨架、实现进度、使用方式和下一步建议
2026-05-29 14:49:41 +08:00

72 lines
2.0 KiB
Python

"""Shared dataclasses for the PAM deploy agent."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Literal
BackendName = Literal["mcp", "script", "fake"]
ExecutionStrategy = Literal["hybrid_node_mcp", "script_only", "fake"]
@dataclass(slots=True)
class ActionResult:
action: str
backend: BackendName
ok: bool
values: dict[str, Any] = field(default_factory=dict)
exit_code: int = 0
tool_name: str = ""
stdout: str = ""
stderr: str = ""
raw_output: str = ""
error_summary: str = ""
@dataclass(slots=True)
class SkillPolicy:
name: str
source_path: str
description: str = ""
allowed_modes: tuple[str, ...] = ("MCP", "API脚本")
allowed_actions: tuple[str, ...] = ()
required_confirmations: tuple[str, ...] = (
"params",
"target_scope",
"rollback",
)
required_params: tuple[str, ...] = ()
optional_params: dict[str, Any] = field(default_factory=dict)
action_sequence: tuple[str, ...] = ()
ip_action_sequence: tuple[str, ...] = ()
forbidden_actions: tuple[str, ...] = (
"script-main-flow",
"auto-rollback",
"modify-deploy-scripts",
)
@dataclass(slots=True)
class AgentState:
run_id: str
params: dict[str, Any]
execution_strategy: ExecutionStrategy
action_backends: dict[str, BackendName]
script_entry: str = ""
script_base_dir: str = "."
config_path: str = ""
trace_file_path: str = ""
node_mcp_server_name: str = ""
node_mcp_tool_names: dict[str, str] = field(default_factory=dict)
completed_global_steps: list[str] = field(default_factory=list)
hash_code: str = ""
node_url: str = ""
online_ips: list[str] = field(default_factory=list)
target_ips: list[str] = field(default_factory=list)
ip_states: dict[str, dict[str, Any]] = field(default_factory=dict)
pending_confirmation: str = ""
last_success_step: str = ""
last_failed_step: str = ""
events: list[dict[str, Any]] = field(default_factory=list)