From 301922d95fbdbd66020b5f9e17b0d86bc7cf500b Mon Sep 17 00:00:00 2001 From: AmriaLin Date: Sun, 18 Oct 2026 04:11:35 +0000 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E8=A1=A5=E4=B8=8A=20=5F=5Fplugin=5F?= =?UTF-8?q?meta=5F=5F=EF=BC=8C=E8=AE=A9=E8=8F=9C=E5=8D=95=E8=83=BD?= =?UTF-8?q?=E5=88=97=E5=87=BA=E8=AE=B0=E5=BF=86=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Amrita 的菜单管理器会跳过没有 metadata 的插件,plugin-memory 一直没定义 __plugin_meta__,所以 /memory 从不进菜单,与 --sudo 无关。顺便 bump 到 0.7.1。 --- amrita_plugin_memory/__init__.py | 11 +++++++++++ pyproject.toml | 2 +- uv.lock | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/amrita_plugin_memory/__init__.py b/amrita_plugin_memory/__init__.py index 6ae2512..cd7f0e7 100644 --- a/amrita_plugin_memory/__init__.py +++ b/amrita_plugin_memory/__init__.py @@ -1,4 +1,5 @@ from nonebot import get_driver, require +from nonebot.plugin import PluginMetadata require("nonebot_plugin_localstore") require("nonebot_plugin_apscheduler") @@ -6,6 +7,16 @@ require("nonebot_plugin_orm") require("amrita.plugins.chat") require("amrita.plugins.menu") + +__plugin_meta__ = PluginMetadata( + name="Amrita长期记忆", + description="长期记忆、备忘录与潜意识调度", + usage="/memory (list|search|delete|memo|dmn) [参数]", + homepage="https://github.com/AmritaBot/plugin-memory", + type="application", + supported_adapters={"~onebot.v11"}, +) + from . import ( config, embed, diff --git a/pyproject.toml b/pyproject.toml index 351172a..d9c7888 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "amrita_plugin_memory" description = "Amrita长期记忆插件" -version = "0.7.0" +version = "0.7.1" dependencies = [ "aiohttp>=3.13.3", "aiologic>=0.16.0", diff --git a/uv.lock b/uv.lock index 91f2dd9..c75ca7a 100644 --- a/uv.lock +++ b/uv.lock @@ -319,7 +319,7 @@ wheels = [ [[package]] name = "amrita-plugin-memory" -version = "0.7.0" +version = "0.7.1" source = { editable = "." } dependencies = [ { name = "aiohttp" }, From d71a73d3b2d75652f29e21d7246f1620b201d4a1 Mon Sep 17 00:00:00 2001 From: AmriaLin Date: Sun, 18 Oct 2026 04:34:08 +0000 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20dmn=20=E6=94=B9=E4=B8=BA=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E7=AE=A1=E7=90=86=E9=80=89=E9=A1=B9=EF=BC=8C=E9=9D=9E?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E6=8C=89=E6=9C=AA=E7=9F=A5=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 菜单与 usage 里不再出现 dmn;调用时先校验超级用户或 lp.admin, 不通过直接回「未知选项」,避免暴露管理入口。README 同步说明。 --- README.md | 4 +++- amrita_plugin_memory/matchers.py | 25 ++++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5b5e6b2..cf26699 100644 --- a/README.md +++ b/README.md @@ -459,9 +459,11 @@ flowchart TD /memory group search <关键词> — 搜索群共享记忆 /memory group delete — 删除群共享记忆(仅管理员 / 群主) /memory memo — 以合并转发查看当前作用域备忘录 -/memory dmn — 立即触发一轮潜意识调度(仅超级用户,需 subconscious.enabled=true 且已配置 target_user_id) +/memory dmn — 立即触发一轮潜意识调度(仅管理员,需 subconscious.enabled=true 且已配置 target_user_id) ``` +`dmn`(别名 `run`、`触发`)属于隐藏选项:不出现在菜单与用法提示中,非管理员调用会按未知选项处理。鉴权顺序为超级用户白名单,其次 `lp.admin` 权限节点。 + 兼容旧格式 `/memory list` 等(默认以个人范围执行)。 ### 运维命令 `ambot memory` diff --git a/amrita_plugin_memory/matchers.py b/amrita_plugin_memory/matchers.py index 4f1b4d2..75fe2a4 100644 --- a/amrita_plugin_memory/matchers.py +++ b/amrita_plugin_memory/matchers.py @@ -4,6 +4,7 @@ from amrita.plugins.chat.utils.functions import split_message_into_chats from amrita.plugins.menu.models import MatcherData +from amrita.plugins.perm.API.admin import is_lp_admin from amrita.utils.send import send_forward_msg from nonebot import get_bot, get_driver, logger, on_command from nonebot.adapters.onebot.v11 import ( @@ -27,8 +28,8 @@ aliases={"记忆"}, state=MatcherData( name="记忆管理", - description="查看/搜索/删除长期记忆,回看备忘录,手动触发潜意识调度", - usage="/memory (list|search|delete|memo|dmn) [参数]", + description="查看/搜索/删除长期记忆,回看备忘录", + usage="/memory (list|search|delete|memo) [参数]", ).model_dump(), ) @@ -60,7 +61,10 @@ async def _( await matcher.finish() if sub in ("dmn", "run", "触发"): - await matcher.finish(await _trigger_dmn(event)) + # 管理入口不进菜单,普通用户按未知选项处理 + if not await _is_admin(event): + await matcher.finish(f"未知选项:{sub}") + await matcher.finish(await _trigger_dmn()) ope = AsyncUserMemory(get_db_conn()) await ope.init() @@ -117,11 +121,18 @@ async def _( await matcher.finish(hint) -async def _trigger_dmn(event: MessageEvent) -> str: - """手动触发潜意识调度,返回给用户的提示文案。""" - if str(event.get_user_id()) not in get_driver().config.superusers: - return "仅超级用户可手动触发潜意识调度" +async def _is_admin(event: MessageEvent) -> bool: + """超级用户或持有 lp.admin 权限节点。""" + if str(event.get_user_id()) in get_driver().config.superusers: + return True + try: + return await is_lp_admin(event) + except Exception: + return False + +async def _trigger_dmn() -> str: + """手动触发潜意识调度,返回给用户的提示文案。调用前需已校验权限。""" cfg = (await DataManager().safe_get_config()).subconscious if not cfg.enabled: return "潜意识调度未启用:subconscious.enabled 为 false"