refactor(schemas): 统一 message/notification 命名边界,旧名收敛至兼容映射表

- notification 域:渠道能力(MessageChannel→NotificationChannel、ChannelCapability* 迁入 notification.py)
- message 域:消息收发(Notification→Message、NotificationType→MessageType、CommingMessage→IncomingMessage、NotificationHistoryItem→MessageHistoryItem、NotificationClear*→MessageClear*)
- Agent 工具契约:send_notification_message→send_message、notification_callback→message_callback
- 源码不保留旧名物理别名,旧导入经 app/runtime/compat/manifest.py SYMBOL_ALIASES 惰性解析
- API 路径与持久化键冻结不变,前端零改动
- 新增兼容守护测试与 docs/rules/07 命名边界规范
This commit is contained in:
jxxghp
2026-08-16 19:32:20 +08:00
parent 98276a68a8
commit 240a4dffe6
96 changed files with 1975 additions and 1751 deletions
+17 -17
View File
@@ -11,13 +11,13 @@ from app.application.messaging.agent import (
from app.runtime.log import logger
from app.modules import _ModuleBase, _MessageBase
from app.modules.synologychat.synologychat import SynologyChat
from app.schemas import MessageChannel, CommingMessage, Notification
from app.schemas import NotificationChannel, IncomingMessage, Message
from app.schemas.types import ModuleType
from app.adapters.network.http import RequestUtils
register_channel_admin_resolver(
MessageChannel.SynologyChat,
NotificationChannel.SynologyChat,
lambda config: resolve_config_principal_ids(config, "SYNOLOGYCHAT_ADMINS"),
)
@@ -54,7 +54,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
"""
super().init_service(service_name=SynologyChat.__name__.lower(),
service_type=SynologyChat)
self._channel = MessageChannel.SynologyChat
self._channel = NotificationChannel.SynologyChat
@staticmethod
def get_name() -> str:
@@ -68,11 +68,11 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
return ModuleType.Notification
@staticmethod
def get_subtype() -> MessageChannel:
def get_subtype() -> NotificationChannel:
"""
获取模块子类型
"""
return MessageChannel.SynologyChat
return NotificationChannel.SynologyChat
@staticmethod
def get_priority() -> int:
@@ -140,7 +140,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
client.send_msg(title="只有管理员才有权限执行此命令", userid=str(userid))
def message_parser(self, source: str, body: Any, form: Any,
args: Any) -> Optional[CommingMessage]:
args: Any) -> Optional[IncomingMessage]:
"""
解析消息内容,返回字典,注意以下约定值:
userid: 用户ID
@@ -189,10 +189,10 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
f"images={len(images) if images else 0}, audios={len(audio_refs) if audio_refs else 0}, "
f"files={len(files) if files else 0}"
)
return CommingMessage(channel=MessageChannel.SynologyChat, source=client_config.name,
return IncomingMessage(channel=NotificationChannel.SynologyChat, source=client_config.name,
userid=user_id, username=user_name,
is_channel_admin=matches_channel_admin(
MessageChannel.SynologyChat,
NotificationChannel.SynologyChat,
client_config.config,
user_id,
), text=text or "",
@@ -204,12 +204,12 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
@classmethod
def _extract_images(
cls, message: dict
) -> Optional[List[CommingMessage.MessageImage]]:
) -> Optional[List[IncomingMessage.MessageImage]]:
images = []
for key in ("file_url", "image_url", "pic_url"):
value = message.get(key)
if isinstance(value, str) and cls._looks_like_image(value):
images.append(CommingMessage.MessageImage(ref=value))
images.append(IncomingMessage.MessageImage(ref=value))
for key in ("attachments", "files"):
raw_value = message.get(key)
@@ -222,12 +222,12 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
items = parsed if isinstance(parsed, list) else [parsed]
for item in items:
if isinstance(item, str) and cls._looks_like_image(item):
images.append(CommingMessage.MessageImage(ref=item))
images.append(IncomingMessage.MessageImage(ref=item))
elif isinstance(item, dict):
url = item.get("url") or item.get("file_url") or item.get("image_url")
if isinstance(url, str) and cls._looks_like_image(url):
images.append(
CommingMessage.MessageImage(
IncomingMessage.MessageImage(
ref=url,
name=item.get("name") or item.get("filename"),
mime_type=item.get("content_type")
@@ -306,7 +306,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
@classmethod
def _extract_files(
cls, message: dict
) -> Optional[List[CommingMessage.MessageAttachment]]:
) -> Optional[List[IncomingMessage.MessageAttachment]]:
files = []
for key in ("attachments", "files"):
raw_value = message.get(key)
@@ -336,7 +336,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
if is_image or is_audio:
continue
files.append(
CommingMessage.MessageAttachment(
IncomingMessage.MessageAttachment(
ref=f"synology://file/{quote(url, safe='')}",
name=item.get("name") or item.get("filename"),
mime_type=item.get("content_type") or item.get("mime_type"),
@@ -367,7 +367,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
return resp.content
return None
def post_message(self, message: Notification, **kwargs) -> None:
def post_message(self, message: Message, **kwargs) -> None:
"""
发送消息
:param message: 消息体
@@ -388,7 +388,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
client.send_msg(title=message.title, text=message.text,
image=message.image, userid=userid, link=message.link)
def post_medias_message(self, message: Notification, medias: List[MediaInfo]) -> None:
def post_medias_message(self, message: Message, medias: List[MediaInfo]) -> None:
"""
发送媒体信息选择列表
:param message: 消息体
@@ -403,7 +403,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase[SynologyChat]):
client.send_medias_msg(title=message.title, medias=medias,
userid=message.userid)
def post_torrents_message(self, message: Notification, torrents: List[Context]) -> None:
def post_torrents_message(self, message: Message, torrents: List[Context]) -> None:
"""
发送种子信息选择列表
:param message: 消息体