from __future__ import annotations from dataclasses import dataclass @dataclass(frozen=True) class ToolDefinition: """Stable business metadata for one runtime tool. The event projection layer owns this translation. Business projectors and UI adapters should never maintain their own copies of tool-name mappings. """ name: str business_label: str category: str _TOOLS: tuple[ToolDefinition, ...] = ( ToolDefinition("get_topic_detail", "选题", "decision-input"), ToolDefinition("get_script_direction", "创作总目标", "decision-input"), ToolDefinition("get_script_snapshot", "当前主脚本", "decision-input"), ToolDefinition("get_account_script_section_patterns", "账号段落模式", "decision-input"), ToolDefinition("get_account_script_persona_points", "账号人设", "decision-input"), ToolDefinition("get_domain_info", "领域信息", "decision-input"), ToolDefinition("save_script_direction", "保存创作目标", "decision-anchor"), ToolDefinition("begin_round", "开启新一轮", "decision-anchor"), ToolDefinition("record_multipath_plan", "记录实现规划", "decision-anchor"), ToolDefinition("implement_paths", "并发派发多路实现", "orchestration"), ToolDefinition("record_multipath_decision", "记录多路决策", "decision-anchor"), ToolDefinition("record_data_decision", "记录数据取舍", "creative-action"), ToolDefinition("record_task_plan", "记录任务规划", "creative-action"), ToolDefinition("update_task_plan_step", "更新规划步骤", "creative-action"), ToolDefinition("get_task_plan", "查看任务规划", "creative-action"), ToolDefinition("create_script_paragraph", "新增脚本段落", "creative-action"), ToolDefinition("batch_update_script_paragraphs", "更新候选脚本内容", "creative-action"), ToolDefinition("append_paragraph_atoms", "补充段落原子点", "creative-action"), ToolDefinition("create_script_element", "新增脚本元素", "creative-action"), ToolDefinition("batch_create_script_elements", "批量新增脚本元素", "creative-action"), ToolDefinition("load_images", "查看图片", "creative-action"), ) TOOL_CATALOG: dict[str, ToolDefinition] = {item.name: item for item in _TOOLS} MAIN_DECISION_READ_TOOLS: frozenset[str] = frozenset( item.name for item in _TOOLS if item.category == "decision-input" ) MAIN_DECISION_ANCHORS: frozenset[str] = frozenset( item.name for item in _TOOLS if item.category == "decision-anchor" ) RETRIEVAL_AGENT_LABELS: dict[str, str] = { "retrieve_data_decode_case": "解构 Case Agent", "retrieve_data_external_search": "外部搜索 Agent", "retrieve_data_knowledge": "知识 Agent", "retrieve_data_pattern_relation": "Pattern / Relation Agent", } def business_tool_label(name: str) -> str: """Return a non-technical label without inventing an unknown translation.""" definition = TOOL_CATALOG.get(str(name or "")) return definition.business_label if definition else "运行记录" def tools_in_category(category: str) -> frozenset[str]: return frozenset(item.name for item in _TOOLS if item.category == category)