ForcePilot/backend/package/yuxi/channels/contract/dtos/command.py

115 lines
3.2 KiB
Python
Raw Normal View History

"""命令 DTO。
定义渠道命令注册与执行的不可变值对象包括命令权限命令 ID渠道命令
命令响应与命令结果所有 DTO 均为 ``dataclass(frozen=True)``依赖
标准库与契约层 ``ValidationError``用于命令插件注册与命令执行结果回传
"""
from __future__ import annotations
from dataclasses import dataclass
from enum import StrEnum
from typing import Literal
from yuxi.channels.contract.errors import ValidationError
class CommandPermission(StrEnum):
"""命令权限。
标识渠道命令的可见性与执行权限层级用于命令注册时声明与执行时校验
继承 ``str, Enum`` 以支持 JSON 序列化与字符串比较
取值
PRIVATE: 仅私聊可用
GROUP: 仅群聊可用
ADMIN: 仅管理员可用
ALL: 所有场景可用
"""
PRIVATE = "private"
GROUP = "group"
ADMIN = "admin"
ALL = "all"
@dataclass(frozen=True)
class CommandId:
"""命令 ID。
标识一条已注册的渠道命令的全局唯一 ID用于命令路由与审计关联
字段
value: 命令 ID 字符串
"""
value: str
@dataclass(frozen=True)
class ChannelCommand:
"""渠道命令FR-15
描述渠道命令的元信息由命令插件声明用于命令注册权限校验与帮助
文档生成
字段
name: 命令名称
description: 命令描述
permission: 命令权限默认 ALL
is_silent: 是否静默执行不回显响应默认 False
"""
name: str
description: str
permission: CommandPermission = CommandPermission.ALL
is_silent: bool = False
def __post_init__(self) -> None:
"""校验必填字段非空。
``name`` ``description`` 必须非空在构造时即抛出
``ValidationError``adapter 不再做该校验INV-8
"""
if not self.name:
raise ValidationError("name", "must not be empty")
if not self.description:
raise ValidationError("description", "must not be empty")
@dataclass(frozen=True)
class CommandResponse:
"""命令响应。
描述命令执行后返回给渠道的内容支持指定内容类型与回复目标
字段
content: 响应内容
content_type: 内容类型text | markdown | rich默认 text
target: 回复目标None 表示原会话
is_silent: 是否静默不回显默认 False
"""
content: str
content_type: Literal["text", "markdown", "rich"] = "text"
target: str | None = None
is_silent: bool = False
@dataclass(frozen=True)
class CommandResult:
"""命令结果。
描述命令执行的最终结果携带命令名是否静默与可选的响应内容用于
管道下游决策是否回显与审计记录
字段
command: 命令名
is_silent: 是否静默执行默认 False
response: 命令响应无响应时为 None
"""
command: str
is_silent: bool = False
response: CommandResponse | None = None