新增完整的 channels 限界上下文模块,包含契约层、领域核心层、应用服务、管道编排、插件体系、基础设施组合根等全层级代码,新增飞书与微信 iLink 渠道插件基础结构,补充各类 DTO、端口协议与领域服务实现。
89 lines
6.8 KiB
Python
89 lines
6.8 KiB
Python
"""配置 schema 元数据契约层定义。
|
||
|
||
定义配置字段的完整 schema 元数据(``CONFIG_SCHEMA``),包括键、类型、
|
||
是否必填、默认值、是否可热更新与约束,作为配置 schema 的唯一真相源
|
||
(§13.1 配置分层 / §6.1 契约层职责)。适配器(如 ``RedisConfigAdapter``)
|
||
与应用层(如 ``ConfigManager``)共享引用本模块,消除 schema 元数据
|
||
下沉至适配器层的 DRY 违反。
|
||
|
||
``HOT_RELOADABLE_KEYS`` / ``NON_HOT_RELOADABLE_KEYS`` 从 ``CONFIG_SCHEMA``
|
||
派生,供 ``ConfigManager`` 做热更新策略校验(ADP-030)。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from yuxi.channels.contract.dtos.config import ConfigField
|
||
|
||
# 配置 schema:全部配置字段的完整元数据(FR-37 配置热更新)。
|
||
# 31 个可热更新字段 + 9 个不可热更新字段,共 40 个。
|
||
# 字段顺序:先可热更新(hot_reloadable=True),后不可热更新(hot_reloadable=False)。
|
||
CONFIG_SCHEMA: tuple[ConfigField, ...] = (
|
||
# === 可热更新字段(hot_reloadable=True)===
|
||
ConfigField(key="dm_policy", type="json", required=False, default=None, hot_reloadable=True),
|
||
ConfigField(key="allow_from", type="json", required=False, default=None, hot_reloadable=True),
|
||
ConfigField(key="rate_limit", type="json", required=False, default=None, hot_reloadable=True),
|
||
ConfigField(key="bot_loop_budget", type="int", required=False, default=0, hot_reloadable=True),
|
||
# FR-08~14 功能开关(Task 30)
|
||
ConfigField(key="rich_message_enabled", type="bool", required=False, default=False, hot_reloadable=True),
|
||
ConfigField(key="status_writeback_enabled", type="bool", required=False, default=False, hot_reloadable=True),
|
||
ConfigField(key="agent_prompt_enabled", type="bool", required=False, default=False, hot_reloadable=True),
|
||
ConfigField(key="channel_tools_enabled", type="bool", required=False, default=False, hot_reloadable=True),
|
||
# AC-22: 消息操作开关默认"开"(FR-12)
|
||
ConfigField(key="message_ops_enabled", type="bool", required=False, default=True, hot_reloadable=True),
|
||
ConfigField(key="streaming_enabled", type="bool", required=False, default=False, hot_reloadable=True),
|
||
ConfigField(key="enable_typing", type="bool", required=False, default=True, hot_reloadable=True),
|
||
ConfigField(key="directory_enabled", type="bool", required=False, default=False, hot_reloadable=True),
|
||
ConfigField(key="command_enabled", type="bool", required=False, default=True, hot_reloadable=True),
|
||
# FR-12 消息操作细粒度开关(PRD §FR-12 配置项)。
|
||
# AC-22 默认行为:表情反应"开"、置顶"关"、卡片更新"关"。
|
||
ConfigField(key="enable_reaction", type="bool", required=False, default=True, hot_reloadable=True),
|
||
ConfigField(key="enable_pin", type="bool", required=False, default=False, hot_reloadable=True),
|
||
ConfigField(key="enable_card_update", type="bool", required=False, default=False, hot_reloadable=True),
|
||
# FR-15 管理员命令权限白名单(账户级,JSON 数组,存放允许执行 ADMIN 权限命令的 peer_id)
|
||
ConfigField(key="admin_users", type="json", required=False, default=None, hot_reloadable=True),
|
||
# FR-29 入站提及策略(账户级,JSON,含 allowed_implicit_kinds 列表,
|
||
# 控制哪些隐式提及类型被视为"已提及",未配置时默认空策略)
|
||
ConfigField(key="mention_policy", type="json", required=False, default=None, hot_reloadable=True),
|
||
# FR-07 会话合并策略开关(默认禁用)
|
||
ConfigField(key="merge_strategy_enabled", type="bool", required=False, default=False, hot_reloadable=True),
|
||
# FR-06 跨渠道身份策略(默认隔离,可选 association 开启跨渠道关联)
|
||
ConfigField(
|
||
key="cross_channel_identity_strategy", type="str", required=False, default="isolation", hot_reloadable=True
|
||
),
|
||
# 可配置值(Task 30)
|
||
ConfigField(key="command_prefix", type="str", required=False, default="/", hot_reloadable=True),
|
||
ConfigField(key="fence_ttl_seconds", type="int", required=False, default=120, hot_reloadable=True),
|
||
ConfigField(key="streaming_min_chunk_interval_ms", type="int", required=False, default=200, hot_reloadable=True),
|
||
ConfigField(key="streaming_ttl_seconds", type="int", required=False, default=60, hot_reloadable=True),
|
||
ConfigField(key="typing_ttl_ms", type="int", required=False, default=10000, hot_reloadable=True),
|
||
ConfigField(key="durability_policy_default", type="str", required=False, default="required", hot_reloadable=True),
|
||
# FR-24 分阶段 ACK 策略(PRD §FR-24)。
|
||
# 四阶段策略:after_record / after_agent_dispatch / after_persist / manual,
|
||
# 默认 after_agent_dispatch(平衡可靠性与响应速度)。
|
||
ConfigField(key="ack_policy", type="str", required=False, default="after_agent_dispatch", hot_reloadable=True),
|
||
# 手动策略下插件忘记 ACK 时核心兜底超时(默认 60s)自动 ACK。
|
||
ConfigField(key="ack_fallback_timeout_seconds", type="int", required=False, default=60, hot_reloadable=True),
|
||
# 传输引擎配置
|
||
ConfigField(key="transport.stall_timeout_ms", type="int", required=False, default=120000, hot_reloadable=True),
|
||
ConfigField(key="transport.backoff_schedule", type="str", required=False, default="1,2,5,10,30", hot_reloadable=True),
|
||
ConfigField(key="transport.backoff_jitter", type="float", required=False, default=0.2, hot_reloadable=True),
|
||
# === 不可热更新字段(hot_reloadable=False)===
|
||
ConfigField(key="webhook_port", type="int", required=False, default=None, hot_reloadable=False),
|
||
ConfigField(key="webhook_secret", type="str", required=False, default=None, hot_reloadable=False),
|
||
ConfigField(key="tls_cert", type="str", required=False, default=None, hot_reloadable=False),
|
||
ConfigField(key="tls_key", type="str", required=False, default=None, hot_reloadable=False),
|
||
ConfigField(key="plugin_entry", type="str", required=False, default=None, hot_reloadable=False),
|
||
ConfigField(key="database_url", type="str", required=False, default=None, hot_reloadable=False),
|
||
ConfigField(key="redis_url", type="str", required=False, default=None, hot_reloadable=False),
|
||
ConfigField(key="transport.max_restart_attempts", type="int", required=False, default=None, hot_reloadable=False),
|
||
ConfigField(key="transport.graceful_shutdown_timeout_s", type="float", required=False, default=10.0, hot_reloadable=False),
|
||
)
|
||
|
||
# 可热更新的配置项键集合(FR-37),从 CONFIG_SCHEMA 派生。
|
||
HOT_RELOADABLE_KEYS = frozenset(f.key for f in CONFIG_SCHEMA if f.hot_reloadable)
|
||
|
||
# 不可热更新的配置项键集合(FR-37),从 CONFIG_SCHEMA 派生。
|
||
NON_HOT_RELOADABLE_KEYS = frozenset(f.key for f in CONFIG_SCHEMA if not f.hot_reloadable)
|
||
|
||
__all__ = ["CONFIG_SCHEMA", "HOT_RELOADABLE_KEYS", "NON_HOT_RELOADABLE_KEYS"]
|