{"owner":"Mai-with-u","repo":"MaiBot","hasSkills":true,"totalSkillsCount":4,"totalTokensCount":3885,"categories":["anthropic-skill","root-instruction"],"hasMcp":false,"mcpConfig":null,"found":["plugins/hello_world_plugin/_manifest.json","src/plugins/built_in/plugin_management/_manifest.json","plugins/hello_world_plugin/CHANGELOG.md","AGENTS.md"],"skills":{"plugins/hello_world_plugin/_manifest.json":"{\n  \"manifest_version\": 2,\n  \"version\": \"2.0.1\",\n  \"name\": \"Hello World 示例插件 (模板插件/勿使用)\",\n  \"description\": \"我的第一个 MaiCore 插件，包含问候功能和时间查询等基础示例\",\n  \"author\": {\n    \"name\": \"MaiBot开发团队\",\n    \"url\": \"https://github.com/MaiM-with-u\"\n  },\n  \"license\": \"GPL-v3.0-or-later\",\n  \"urls\": {\n    \"repository\": \"https://github.com/MaiM-with-u/maibot\",\n    \"homepage\": \"https://github.com/MaiM-with-u/maibot\",\n    \"documentation\": \"https://github.com/MaiM-with-u/maibot\",\n    \"issues\": \"https://github.com/MaiM-with-u/maibot/issues\"\n  },\n  \"changelog\": \"CHANGELOG.md\",\n  \"host_application\": {\n    \"min_version\": \"1.3.0\",\n    \"max_version\": \"1.3.99\"\n  },\n  \"sdk\": {\n    \"min_version\": \"2.0.0\",\n    \"max_version\": \"2.99.99\"\n  },\n  \"dependencies\": [],\n  \"display\": {\n    \"icon\": {\n      \"type\": \"local\",\n      \"value\": \"assets/icon.svg\",\n      \"fallback\": \"puzzle\",\n      \"background\": \"#1C272C\"\n    }\n  },\n  \"capabilities\": [\n    \"send.text\",\n    \"send.forward\",\n    \"send.hybrid\",\n    \"emoji.get_random\",\n    \"config.get\"\n  ],\n  \"i18n\": {\n    \"default_locale\": \"zh-CN\",\n    \"locales_path\": \"_locales\",\n    \"supported_locales\": [\n      \"zh-CN\"\n    ]\n  },\n  \"id\": \"maibot-team.hello-world-plugin\"\n}\n","src/plugins/built_in/plugin_management/_manifest.json":"{\n  \"manifest_version\": 2,\n  \"version\": \"2.2.0\",\n  \"name\": \"插件和组件管理 (Plugin and Component Management)\",\n  \"description\": \"通过系统 API 管理插件和组件的生命周期，包括加载、卸载、启用和禁用等操作。\",\n  \"author\": {\n    \"name\": \"MaiBot团队\",\n    \"url\": \"https://github.com/MaiM-with-u\"\n  },\n  \"license\": \"GPL-v3.0-or-later\",\n  \"urls\": {\n    \"repository\": \"https://github.com/MaiM-with-u/maibot\",\n    \"homepage\": \"https://github.com/MaiM-with-u/maibot\",\n    \"documentation\": \"https://github.com/MaiM-with-u/maibot\",\n    \"issues\": \"https://github.com/MaiM-with-u/maibot/issues\"\n  },\n  \"host_application\": {\n    \"min_version\": \"1.0.0\",\n    \"max_version\": \"999.999.999\"\n  },\n  \"sdk\": {\n    \"min_version\": \"2.0.0\",\n    \"max_version\": \"2.99.99\"\n  },\n  \"dependencies\": [],\n  \"capabilities\": [\n    \"component.get_all_plugins\",\n    \"component.list_loaded_plugins\",\n    \"component.list_registered_plugins\",\n    \"component.enable\",\n    \"component.disable\",\n    \"component.load_plugin\",\n    \"component.unload_plugin\",\n    \"component.reload_plugin\",\n    \"component.update_plugin_config\",\n    \"send.text\",\n    \"config.get\",\n    \"config.get_plugin\"\n  ],\n  \"i18n\": {\n    \"default_locale\": \"zh-CN\",\n    \"locales_path\": \"_locales\",\n    \"supported_locales\": [\n      \"zh-CN\"\n    ]\n  },\n  \"id\": \"builtin.plugin-management\"\n}\n","plugins/hello_world_plugin/CHANGELOG.md":"# Changelog\n\n## 未发布\n\n### 用户感知功能\n\n- 新增详情与循环示例页：表格行详情、单记录确认删除、动态卡片和空数据条件显示。\n- 新增 Hello World 顶部概览和侧边问候体验页，展示统计卡片、图表、表格与表单组件。\n\n### 开发侧\n\n- 演示 `dialog`、`collapsible`、`repeat`、`when` 及选中行字段到 API 参数的映射。\n- 演示 `webui.json` 与插件静态 API 的绑定、参数校验、操作后刷新和危险操作确认。\n\n## [2.0.0] - 2026-06-26\n\n### 用户感知功能\n\n- 提供问候、时间查询、复读和消息打印等基础示例能力。\n\n### 开发侧\n\n- 演示 Manifest v2、配置模型、Tool、Command、Action 和 EventHandler 的基础写法。\n","AGENTS.md":"# 代码规范\n# import 规范\n在从外部库进行导入时候，请遵循以下顺序：\n1. 对于标准库和第三方库的导入，请按照如下顺序：\n    - 需要使用`from ... import ...`语法的导入放在前面。\n    - 直接使用`import ...`语法的导入放在后面。\n    - 对于使用`from ... import ...`导入的多个项，请**在保证不会引起import错误的前提下**，按照**字母顺序**排列。\n    - 对于使用`import ...`导入的多个项，请**在保证不会引起import错误的前提下**，按照**字母顺序**排列。\n2. 对于本地模块的导入，请按照如下顺序：\n    - 对于同一个文件夹下的模块导入，使用相对导入，排列顺序按照**不发生import错误的前提下**，随便排列。\n    - 对于不同文件夹下的模块导入，使用绝对导入。这些导入应该以`from src`开头，并且按照**不发生import错误的前提下**，尽量使得第二层的文件夹名称相同的导入放在一起；第二层文件夹名称排列随机。\n3. 标准库和第三方库的导入应该放在本地模块导入的前面。\n\n## 注释规范\n1. 如果原来的代码中有注释，则重构的时候，除非这部分代码被删除，否则相同功能的代码应该保留注释（可以对注释进行修改以保持准确性，但不应该删除注释）。\n2. 如果原来的代码中没有注释，则重构的时候，如果某个功能块的代码较长或者逻辑较为复杂，则应该添加注释来解释这部分代码的功能和逻辑。\n## 类型注解规范\n1. 重构代码时，如果原来的代码中有类型注解，则相同功能的代码应该保留类型注解（可以对类型注解进行修改以保持准确性，但不应该删除类型注解）。\n2. 重构代码时，如果原来的代码中没有类型注解，则重构的时候，如果某个函数的功能较为复杂或者参数较多，则应该添加类型注解来提高代码的可读性和可维护性。（对于简单的变量，可以不添加类型注解）\n3. 对于参数化泛型，应该使用`typing`模块中的类型注解来指定参数化泛型的类型。\n    - 例如，使用`List[int]`来表示一个包含整数的列表，使用`Dict[str, Any]`来表示一个键为字符串，值为任意类型的字典。\n\n## 变量规范\n1. 当确定某个变量/实例是某种类型的时候（优先按照类型注解确定，除非你分析出类型注解是错误的），可以不必使用`or`进行fallback。\n    - 例如，`bot_nickname = (global_config.bot.nickname or \"\").strip()` 可以改为 `bot_nickname = global_config.bot.nickname.strip()`，前提是我们确定`global_config.bot.nickname`一定是一个字符串。\n\n## 类属性使用规范\n1. 应该尽量减少使用getattr和setattr方法，除非是在对一个动态类进行处理或者使用Monkeypatch完成Pytest\n2. 在重构代码时，如果遇到getattr和setattr，应该尝试检查这个类实例是否有这个属性，如果有，则直接替换为类属性访问写法。\n    - 举例：`v = getattr(instance, \"value\", \"\")` 在检查到`instance`有`value`属性后应该改为`v = instance.value`\n\n## debug规范\n1. 不要总是想找兜底，一定要精准的找到问题的核心，然后提出建议，兜底是不合适，难以维护的。\n2. 不要总是考虑fallback，如果哪里有错误，一定要让他及时完整的暴露，而不是用fall_back兜底掩盖过去\n\n## 验证与排查纪律\n1. 修 CI 报错先判存量：查父提交同 workflow 的 run 结论，分支早就红的问题不是你刚改的，别先背锅再动手；但若要 CI 转绿，存量失败该修也要修。\n2. 验证适度，高成本验证先缩小范围：全量测试一轮几分钟，先单独跑目标文件；单独跑过、全量下才挂（尤其 waitFor 超时）即环境抖动。回头成本低时按最可能解释先推进，不要为每个结论做 stash 对比、多轮重跑。\n3. 下「环境问题/存量失败」结论前先确认环境一致性：本地依赖与 CI lockfile 不一致（如本地 pnpm、CI bun）会产生假失败；判定以干净装依赖的环境（同 lockfile）为准。\n4. 往沙箱/临时目录复制文件必须保真：PowerShell `Out-File`（尤其 `-NoNewline`）会吞换行制造幽灵失败，用 `Copy-Item` 或 Python 二进制读写；复制后先哈希或 diff 比对再下结论。\n\n# 运行/调试/构建/测试/依赖\n优先使用uv\n依赖项以 pyproject.toml 为准，要同步更新requirements.txt\n\n# Webui规范\n对于dashboard的前端测试，在细节改动，改动范围小时，别测试，别写测试，别build，直接快速做，避免无谓的时间浪费和代码浪费\n修改完webui，如果是小改动小修复，不用急着npm run build。当完成一个较大功能新增或者较广重构时，才需要运行 npm run build。\n\nWebUI 开发服务固定起到 7999 端口。\n\n# 配置文件修改\n如果你需要改动配置文件，不需要修改实际的bot_config.toml或者model_config.toml，只需要修改配置文件模版，并新增一个版本号即可，也不必要为配置改动创建测试文件。\n除非明确说明，否则不要擅自新增 ConfigUpgradeHook\n禁止改动 legacy_migration，此文件以固定\n\n# 事件循环规范\n不要阻塞事件循环。同一进程里有两个事件循环（bot 主循环、WebUI 独立线程的循环），任何一个被同步工作占住，界面上对应的一侧就会整体卡住。\n\n- 路由处理器只做同步工作（查数据库、读文件、算数据）时写成普通 `def`，不要写 `async def`：FastAPI 会把 `def` 端点交给线程池执行，而 `async def` 会占用事件循环。只有确实需要 `await`，或需要「当前有运行中的事件循环」（`asyncio.create_task`、`asyncio.get_running_loop` 等）时，才写 `async def`。\n- `async def` 函数体内不要直接调用同步阻塞接口：`get_db_session()`、`session.exec()`、`find_messages()`、`metadata_store.query()`、批量文件读写等，应放进 `asyncio.to_thread(...)`。\n- WebUI 同步端点的并发数由 `src/webui/app.py` 的 `limit_sync_endpoint_concurrency()` 限制在 SQLite 连接池容量以内，新增同步端点不需要再单独控制并发。\n- 主循环与 WebUI 循环各挂一个卡顿看门狗（`src/common/event_loop_watchdog.py`）。日志里出现「事件循环卡顿: loop=... 迟到=...s」即可看出是哪一侧被阻塞、卡了多久。\n\n# 会话 ID 规范\n除聊天流创建/注册链路外，业务模块不应自行调用 `SessionUtils.calculate_session_id` 计算资源归属 ID。表达学习、黑话、记忆、WebUI、配置匹配等模块应通过 `chat_manager` 的内部接口，基于 platform、目标 ID 和聊天类型解析已存在的真实聊天流；如果解析不到真实 `ChatSession.session_id`，不要把自行计算的 fallback hash 写入数据库。\n\nwebui中设计聊天会话流的，涉及显示聊天流信息的，优先显示聊天流实际名称（群名称或 xxx的私聊），而不是session_id\n\n# 关于 A_memorix 修改\n如果修改涉及 `src/A_memorix`，请先阅读 `src/A_memorix/MODIFICATION_POLICY.md`。\n\n1. `src/A_memorix` 的实现层改动应优先遵守 `src/A_memorix/MODIFICATION_POLICY.md` 中的归属约束。\n2. 不要提交无边界的 `ruff`、格式化、导入整理或大面积实现整理。\n3. 本地实验目录或依赖其运行的测试，除非明确说明并确认，否则不要进入共享历史。\n\n# prompt模板、\n涉及对prompt模板的修改，要同步修改英文和日文的文件，对齐到中文\n\n# maibot插件开发文档\nhttps://github.com/Mai-with-u/maibot-plugin-sdk/blob/main/docs/guide.md\n\n如果你要编写插件，不要改动根目录的.gitignore，而是在/plugins下创建独立仓库，然后进行编写\n如果你要编写插件有需求需要改动主程序代码，请你先请求许可。\n\n# 如何提交maibot插件\nhttps://github.com/Mai-with-u/plugin-repo/blob/main/CONTRIBUTING.md\n\n# changelog编写\n建议分为两部分，一部分是主要功能，一部分是细节（包含修复和插件sdk,api改动）。最好一个功能一行，按模块分。\n不用修改changelog.dev，改动应该都写changelog.md\n一般不写入changelog的内容：\n版本号提升或更新项目依赖\n"},"files":{"plugins/hello_world_plugin/_manifest.json":"{\n  \"manifest_version\": 2,\n  \"version\": \"2.0.1\",\n  \"name\": \"Hello World 示例插件 (模板插件/勿使用)\",\n  \"description\": \"我的第一个 MaiCore 插件，包含问候功能和时间查询等基础示例\",\n  \"author\": {\n    \"name\": \"MaiBot开发团队\",\n    \"url\": \"https://github.com/MaiM-with-u\"\n  },\n  \"license\": \"GPL-v3.0-or-later\",\n  \"urls\": {\n    \"repository\": \"https://github.com/MaiM-with-u/maibot\",\n    \"homepage\": \"https://github.com/MaiM-with-u/maibot\",\n    \"documentation\": \"https://github.com/MaiM-with-u/maibot\",\n    \"issues\": \"https://github.com/MaiM-with-u/maibot/issues\"\n  },\n  \"changelog\": \"CHANGELOG.md\",\n  \"host_application\": {\n    \"min_version\": \"1.3.0\",\n    \"max_version\": \"1.3.99\"\n  },\n  \"sdk\": {\n    \"min_version\": \"2.0.0\",\n    \"max_version\": \"2.99.99\"\n  },\n  \"dependencies\": [],\n  \"display\": {\n    \"icon\": {\n      \"type\": \"local\",\n      \"value\": \"assets/icon.svg\",\n      \"fallback\": \"puzzle\",\n      \"background\": \"#1C272C\"\n    }\n  },\n  \"capabilities\": [\n    \"send.text\",\n    \"send.forward\",\n    \"send.hybrid\",\n    \"emoji.get_random\",\n    \"config.get\"\n  ],\n  \"i18n\": {\n    \"default_locale\": \"zh-CN\",\n    \"locales_path\": \"_locales\",\n    \"supported_locales\": [\n      \"zh-CN\"\n    ]\n  },\n  \"id\": \"maibot-team.hello-world-plugin\"\n}\n","src/plugins/built_in/plugin_management/_manifest.json":"{\n  \"manifest_version\": 2,\n  \"version\": \"2.2.0\",\n  \"name\": \"插件和组件管理 (Plugin and Component Management)\",\n  \"description\": \"通过系统 API 管理插件和组件的生命周期，包括加载、卸载、启用和禁用等操作。\",\n  \"author\": {\n    \"name\": \"MaiBot团队\",\n    \"url\": \"https://github.com/MaiM-with-u\"\n  },\n  \"license\": \"GPL-v3.0-or-later\",\n  \"urls\": {\n    \"repository\": \"https://github.com/MaiM-with-u/maibot\",\n    \"homepage\": \"https://github.com/MaiM-with-u/maibot\",\n    \"documentation\": \"https://github.com/MaiM-with-u/maibot\",\n    \"issues\": \"https://github.com/MaiM-with-u/maibot/issues\"\n  },\n  \"host_application\": {\n    \"min_version\": \"1.0.0\",\n    \"max_version\": \"999.999.999\"\n  },\n  \"sdk\": {\n    \"min_version\": \"2.0.0\",\n    \"max_version\": \"2.99.99\"\n  },\n  \"dependencies\": [],\n  \"capabilities\": [\n    \"component.get_all_plugins\",\n    \"component.list_loaded_plugins\",\n    \"component.list_registered_plugins\",\n    \"component.enable\",\n    \"component.disable\",\n    \"component.load_plugin\",\n    \"component.unload_plugin\",\n    \"component.reload_plugin\",\n    \"component.update_plugin_config\",\n    \"send.text\",\n    \"config.get\",\n    \"config.get_plugin\"\n  ],\n  \"i18n\": {\n    \"default_locale\": \"zh-CN\",\n    \"locales_path\": \"_locales\",\n    \"supported_locales\": [\n      \"zh-CN\"\n    ]\n  },\n  \"id\": \"builtin.plugin-management\"\n}\n","plugins/hello_world_plugin/CHANGELOG.md":"# Changelog\n\n## 未发布\n\n### 用户感知功能\n\n- 新增详情与循环示例页：表格行详情、单记录确认删除、动态卡片和空数据条件显示。\n- 新增 Hello World 顶部概览和侧边问候体验页，展示统计卡片、图表、表格与表单组件。\n\n### 开发侧\n\n- 演示 `dialog`、`collapsible`、`repeat`、`when` 及选中行字段到 API 参数的映射。\n- 演示 `webui.json` 与插件静态 API 的绑定、参数校验、操作后刷新和危险操作确认。\n\n## [2.0.0] - 2026-06-26\n\n### 用户感知功能\n\n- 提供问候、时间查询、复读和消息打印等基础示例能力。\n\n### 开发侧\n\n- 演示 Manifest v2、配置模型、Tool、Command、Action 和 EventHandler 的基础写法。\n","AGENTS.md":"# 代码规范\n# import 规范\n在从外部库进行导入时候，请遵循以下顺序：\n1. 对于标准库和第三方库的导入，请按照如下顺序：\n    - 需要使用`from ... import ...`语法的导入放在前面。\n    - 直接使用`import ...`语法的导入放在后面。\n    - 对于使用`from ... import ...`导入的多个项，请**在保证不会引起import错误的前提下**，按照**字母顺序**排列。\n    - 对于使用`import ...`导入的多个项，请**在保证不会引起import错误的前提下**，按照**字母顺序**排列。\n2. 对于本地模块的导入，请按照如下顺序：\n    - 对于同一个文件夹下的模块导入，使用相对导入，排列顺序按照**不发生import错误的前提下**，随便排列。\n    - 对于不同文件夹下的模块导入，使用绝对导入。这些导入应该以`from src`开头，并且按照**不发生import错误的前提下**，尽量使得第二层的文件夹名称相同的导入放在一起；第二层文件夹名称排列随机。\n3. 标准库和第三方库的导入应该放在本地模块导入的前面。\n\n## 注释规范\n1. 如果原来的代码中有注释，则重构的时候，除非这部分代码被删除，否则相同功能的代码应该保留注释（可以对注释进行修改以保持准确性，但不应该删除注释）。\n2. 如果原来的代码中没有注释，则重构的时候，如果某个功能块的代码较长或者逻辑较为复杂，则应该添加注释来解释这部分代码的功能和逻辑。\n## 类型注解规范\n1. 重构代码时，如果原来的代码中有类型注解，则相同功能的代码应该保留类型注解（可以对类型注解进行修改以保持准确性，但不应该删除类型注解）。\n2. 重构代码时，如果原来的代码中没有类型注解，则重构的时候，如果某个函数的功能较为复杂或者参数较多，则应该添加类型注解来提高代码的可读性和可维护性。（对于简单的变量，可以不添加类型注解）\n3. 对于参数化泛型，应该使用`typing`模块中的类型注解来指定参数化泛型的类型。\n    - 例如，使用`List[int]`来表示一个包含整数的列表，使用`Dict[str, Any]`来表示一个键为字符串，值为任意类型的字典。\n\n## 变量规范\n1. 当确定某个变量/实例是某种类型的时候（优先按照类型注解确定，除非你分析出类型注解是错误的），可以不必使用`or`进行fallback。\n    - 例如，`bot_nickname = (global_config.bot.nickname or \"\").strip()` 可以改为 `bot_nickname = global_config.bot.nickname.strip()`，前提是我们确定`global_config.bot.nickname`一定是一个字符串。\n\n## 类属性使用规范\n1. 应该尽量减少使用getattr和setattr方法，除非是在对一个动态类进行处理或者使用Monkeypatch完成Pytest\n2. 在重构代码时，如果遇到getattr和setattr，应该尝试检查这个类实例是否有这个属性，如果有，则直接替换为类属性访问写法。\n    - 举例：`v = getattr(instance, \"value\", \"\")` 在检查到`instance`有`value`属性后应该改为`v = instance.value`\n\n## debug规范\n1. 不要总是想找兜底，一定要精准的找到问题的核心，然后提出建议，兜底是不合适，难以维护的。\n2. 不要总是考虑fallback，如果哪里有错误，一定要让他及时完整的暴露，而不是用fall_back兜底掩盖过去\n\n## 验证与排查纪律\n1. 修 CI 报错先判存量：查父提交同 workflow 的 run 结论，分支早就红的问题不是你刚改的，别先背锅再动手；但若要 CI 转绿，存量失败该修也要修。\n2. 验证适度，高成本验证先缩小范围：全量测试一轮几分钟，先单独跑目标文件；单独跑过、全量下才挂（尤其 waitFor 超时）即环境抖动。回头成本低时按最可能解释先推进，不要为每个结论做 stash 对比、多轮重跑。\n3. 下「环境问题/存量失败」结论前先确认环境一致性：本地依赖与 CI lockfile 不一致（如本地 pnpm、CI bun）会产生假失败；判定以干净装依赖的环境（同 lockfile）为准。\n4. 往沙箱/临时目录复制文件必须保真：PowerShell `Out-File`（尤其 `-NoNewline`）会吞换行制造幽灵失败，用 `Copy-Item` 或 Python 二进制读写；复制后先哈希或 diff 比对再下结论。\n\n# 运行/调试/构建/测试/依赖\n优先使用uv\n依赖项以 pyproject.toml 为准，要同步更新requirements.txt\n\n# Webui规范\n对于dashboard的前端测试，在细节改动，改动范围小时，别测试，别写测试，别build，直接快速做，避免无谓的时间浪费和代码浪费\n修改完webui，如果是小改动小修复，不用急着npm run build。当完成一个较大功能新增或者较广重构时，才需要运行 npm run build。\n\nWebUI 开发服务固定起到 7999 端口。\n\n# 配置文件修改\n如果你需要改动配置文件，不需要修改实际的bot_config.toml或者model_config.toml，只需要修改配置文件模版，并新增一个版本号即可，也不必要为配置改动创建测试文件。\n除非明确说明，否则不要擅自新增 ConfigUpgradeHook\n禁止改动 legacy_migration，此文件以固定\n\n# 事件循环规范\n不要阻塞事件循环。同一进程里有两个事件循环（bot 主循环、WebUI 独立线程的循环），任何一个被同步工作占住，界面上对应的一侧就会整体卡住。\n\n- 路由处理器只做同步工作（查数据库、读文件、算数据）时写成普通 `def`，不要写 `async def`：FastAPI 会把 `def` 端点交给线程池执行，而 `async def` 会占用事件循环。只有确实需要 `await`，或需要「当前有运行中的事件循环」（`asyncio.create_task`、`asyncio.get_running_loop` 等）时，才写 `async def`。\n- `async def` 函数体内不要直接调用同步阻塞接口：`get_db_session()`、`session.exec()`、`find_messages()`、`metadata_store.query()`、批量文件读写等，应放进 `asyncio.to_thread(...)`。\n- WebUI 同步端点的并发数由 `src/webui/app.py` 的 `limit_sync_endpoint_concurrency()` 限制在 SQLite 连接池容量以内，新增同步端点不需要再单独控制并发。\n- 主循环与 WebUI 循环各挂一个卡顿看门狗（`src/common/event_loop_watchdog.py`）。日志里出现「事件循环卡顿: loop=... 迟到=...s」即可看出是哪一侧被阻塞、卡了多久。\n\n# 会话 ID 规范\n除聊天流创建/注册链路外，业务模块不应自行调用 `SessionUtils.calculate_session_id` 计算资源归属 ID。表达学习、黑话、记忆、WebUI、配置匹配等模块应通过 `chat_manager` 的内部接口，基于 platform、目标 ID 和聊天类型解析已存在的真实聊天流；如果解析不到真实 `ChatSession.session_id`，不要把自行计算的 fallback hash 写入数据库。\n\nwebui中设计聊天会话流的，涉及显示聊天流信息的，优先显示聊天流实际名称（群名称或 xxx的私聊），而不是session_id\n\n# 关于 A_memorix 修改\n如果修改涉及 `src/A_memorix`，请先阅读 `src/A_memorix/MODIFICATION_POLICY.md`。\n\n1. `src/A_memorix` 的实现层改动应优先遵守 `src/A_memorix/MODIFICATION_POLICY.md` 中的归属约束。\n2. 不要提交无边界的 `ruff`、格式化、导入整理或大面积实现整理。\n3. 本地实验目录或依赖其运行的测试，除非明确说明并确认，否则不要进入共享历史。\n\n# prompt模板、\n涉及对prompt模板的修改，要同步修改英文和日文的文件，对齐到中文\n\n# maibot插件开发文档\nhttps://github.com/Mai-with-u/maibot-plugin-sdk/blob/main/docs/guide.md\n\n如果你要编写插件，不要改动根目录的.gitignore，而是在/plugins下创建独立仓库，然后进行编写\n如果你要编写插件有需求需要改动主程序代码，请你先请求许可。\n\n# 如何提交maibot插件\nhttps://github.com/Mai-with-u/plugin-repo/blob/main/CONTRIBUTING.md\n\n# changelog编写\n建议分为两部分，一部分是主要功能，一部分是细节（包含修复和插件sdk,api改动）。最好一个功能一行，按模块分。\n不用修改changelog.dev，改动应该都写changelog.md\n一般不写入changelog的内容：\n版本号提升或更新项目依赖\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/Mai-with-u/MaiBot/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# 代码规范\n# import 规范\n在从外部库进行导入时候，请遵循以下顺序：\n1. 对于标准库和第三方库的导入，请按照如下顺序：\n    - 需要使用`from ... import ...`语法的导入放在前面。\n    - 直接使用`import ...`语法的导入放在后面。\n    - 对于使用`from ... import ...`导入的多个项，请**在保证不会引起import错误的前提下**，按照**字母顺序**排列。\n    - 对于使用`import ...`导入的多个项，请**在保证不会引起import错误的前提下**，按照**字母顺序**排列。\n2. 对于本地模块的导入，请按照如下顺序：\n    - 对于同一个文件夹下的模块导入，使用相对导入，排列顺序按照**不发生import错误的前提下**，随便排列。\n    - 对于不同文件夹下的模块导入，使用绝对导入。这些导入应该以`from src`开头，并且按照**不发生import错误的前提下**，尽量使得第二层的文件夹名称相同的导入放在一起；第二层文件夹名称排列随机。\n3. 标准库和第三方库的导入应该放在本地模块导入的前面。\n\n## 注释规范\n1. 如果原来的代码中有注释，则重构的时候，除非这部分代码被删除，否则相同功能的代码应该保留注释（可以对注释进行修改以保持准确性，但不应该删除注释）。\n2. 如果原来的代码中没有注释，则重构的时候，如果某个功能块的代码较长或者逻辑较为复杂，则应该添加注释来解释这部分代码的功能和逻辑。\n## 类型注解规范\n1. 重构代码时，如果原来的代码中有类型注解，则相同功能的代码应该保留类型注解（可以对类型注解进行修改以保持准确性，但不应该删除类型注解）。\n2. 重构代码时，如果原来的代码中没有类型注解，则重构的时候，如果某个函数的功能较为复杂或者参数较多，则应该添加类型注解来提高代码的可读性和可维护性。（对于简单的变量，可以不添加类型注解）\n3. 对于参数化泛型，应该使用`typing`模块中的类型注解来指定参数化泛型的类型。\n    - 例如，使用`List[int]`来表示一个包含整数的列表，使用`Dict[str, Any]`来表示一个键为字符串，值为任意类型的字典。\n\n## 变量规范\n1. 当确定某个变量/实例是某种类型的时候（优先按照类型注解确定，除非你分析出类型注解是错误的），可以不必使用`or`进行fallback。\n    - 例如，`bot_nickname = (global_config.bot.nickname or \"\").strip()` 可以改为 `bot_nickname = global_config.bot.nickname.strip()`，前提是我们确定`global_config.bot.nickname`一定是一个字符串。\n\n## 类属性使用规范\n1. 应该尽量减少使用getattr和setattr方法，除非是在对一个动态类进行处理或者使用Monkeypatch完成Pytest\n2. 在重构代码时，如果遇到getattr和setattr，应该尝试检查这个类实例是否有这个属性，如果有，则直接替换为类属性访问写法。\n    - 举例：`v = getattr(instance, \"value\", \"\")` 在检查到`instance`有`value`属性后应该改为`v = instance.value`\n\n## debug规范\n1. 不要总是想找兜底，一定要精准的找到问题的核心，然后提出建议，兜底是不合适，难以维护的。\n2. 不要总是考虑fallback，如果哪里有错误，一定要让他及时完整的暴露，而不是用fall_back兜底掩盖过去\n\n## 验证与排查纪律\n1. 修 CI 报错先判存量：查父提交同 workflow 的 run 结论，分支早就红的问题不是你刚改的，别先背锅再动手；但若要 CI 转绿，存量失败该修也要修。\n2. 验证适度，高成本验证先缩小范围：全量测试一轮几分钟，先单独跑目标文件；单独跑过、全量下才挂（尤其 waitFor 超时）即环境抖动。回头成本低时按最可能解释先推进，不要为每个结论做 stash 对比、多轮重跑。\n3. 下「环境问题/存量失败」结论前先确认环境一致性：本地依赖与 CI lockfile 不一致（如本地 pnpm、CI bun）会产生假失败；判定以干净装依赖的环境（同 lockfile）为准。\n4. 往沙箱/临时目录复制文件必须保真：PowerShell `Out-File`（尤其 `-NoNewline`）会吞换行制造幽灵失败，用 `Copy-Item` 或 Python 二进制读写；复制后先哈希或 diff 比对再下结论。\n\n# 运行/调试/构建/测试/依赖\n优先使用uv\n依赖项以 pyproject.toml 为准，要同步更新requirements.txt\n\n# Webui规范\n对于dashboard的前端测试，在细节改动，改动范围小时，别测试，别写测试，别build，直接快速做，避免无谓的时间浪费和代码浪费\n修改完webui，如果是小改动小修复，不用急着npm run build。当完成一个较大功能新增或者较广重构时，才需要运行 npm run build。\n\nWebUI 开发服务固定起到 7999 端口。\n\n# 配置文件修改\n如果你需要改动配置文件，不需要修改实际的bot_config.toml或者model_config.toml，只需要修改配置文件模版，并新增一个版本号即可，也不必要为配置改动创建测试文件。\n除非明确说明，否则不要擅自新增 ConfigUpgradeHook\n禁止改动 legacy_migration，此文件以固定\n\n# 事件循环规范\n不要阻塞事件循环。同一进程里有两个事件循环（bot 主循环、WebUI 独立线程的循环），任何一个被同步工作占住，界面上对应的一侧就会整体卡住。\n\n- 路由处理器只做同步工作（查数据库、读文件、算数据）时写成普通 `def`，不要写 `async def`：FastAPI 会把 `def` 端点交给线程池执行，而 `async def` 会占用事件循环。只有确实需要 `await`，或需要「当前有运行中的事件循环」（`asyncio.create_task`、`asyncio.get_running_loop` 等）时，才写 `async def`。\n- `async def` 函数体内不要直接调用同步阻塞接口：`get_db_session()`、`session.exec()`、`find_messages()`、`metadata_store.query()`、批量文件读写等，应放进 `asyncio.to_thread(...)`。\n- WebUI 同步端点的并发数由 `src/webui/app.py` 的 `limit_sync_endpoint_concurrency()` 限制在 SQLite 连接池容量以内，新增同步端点不需要再单独控制并发。\n- 主循环与 WebUI 循环各挂一个卡顿看门狗（`src/common/event_loop_watchdog.py`）。日志里出现「事件循环卡顿: loop=... 迟到=...s」即可看出是哪一侧被阻塞、卡了多久。\n\n# 会话 ID 规范\n除聊天流创建/注册链路外，业务模块不应自行调用 `SessionUtils.calculate_session_id` 计算资源归属 ID。表达学习、黑话、记忆、WebUI、配置匹配等模块应通过 `chat_manager` 的内部接口，基于 platform、目标 ID 和聊天类型解析已存在的真实聊天流；如果解析不到真实 `ChatSession.session_id`，不要把自行计算的 fallback hash 写入数据库。\n\nwebui中设计聊天会话流的，涉及显示聊天流信息的，优先显示聊天流实际名称（群名称或 xxx的私聊），而不是session_id\n\n# 关于 A_memorix 修改\n如果修改涉及 `src/A_memorix`，请先阅读 `src/A_memorix/MODIFICATION_POLICY.md`。\n\n1. `src/A_memorix` 的实现层改动应优先遵守 `src/A_memorix/MODIFICATION_POLICY.md` 中的归属约束。\n2. 不要提交无边界的 `ruff`、格式化、导入整理或大面积实现整理。\n3. 本地实验目录或依赖其运行的测试，除非明确说明并确认，否则不要进入共享历史。\n\n# prompt模板、\n涉及对prompt模板的修改，要同步修改英文和日文的文件，对齐到中文\n\n# maibot插件开发文档\nhttps://github.com/Mai-with-u/maibot-plugin-sdk/blob/main/docs/guide.md\n\n如果你要编写插件，不要改动根目录的.gitignore，而是在/plugins下创建独立仓库，然后进行编写\n如果你要编写插件有需求需要改动主程序代码，请你先请求许可。\n\n# 如何提交maibot插件\nhttps://github.com/Mai-with-u/plugin-repo/blob/main/CONTRIBUTING.md\n\n# changelog编写\n建议分为两部分，一部分是主要功能，一部分是细节（包含修复和插件sdk,api改动）。最好一个功能一行，按模块分。\n不用修改changelog.dev，改动应该都写changelog.md\n一般不写入changelog的内容：\n版本号提升或更新项目依赖\n","isInternal":false,"tokens":2799,"sizeBytes":8386},{"name":"_manifest.json","path":"plugins/hello_world_plugin/_manifest.json","rawUrl":"https://raw.githubusercontent.com/Mai-with-u/MaiBot/HEAD/plugins/hello_world_plugin/_manifest.json","title":"Hello World 示例插件 (模板插件/勿使用)","category":"anthropic-skill","format":"json","content":"{\n  \"manifest_version\": 2,\n  \"version\": \"2.0.1\",\n  \"name\": \"Hello World 示例插件 (模板插件/勿使用)\",\n  \"description\": \"我的第一个 MaiCore 插件，包含问候功能和时间查询等基础示例\",\n  \"author\": {\n    \"name\": \"MaiBot开发团队\",\n    \"url\": \"https://github.com/MaiM-with-u\"\n  },\n  \"license\": \"GPL-v3.0-or-later\",\n  \"urls\": {\n    \"repository\": \"https://github.com/MaiM-with-u/maibot\",\n    \"homepage\": \"https://github.com/MaiM-with-u/maibot\",\n    \"documentation\": \"https://github.com/MaiM-with-u/maibot\",\n    \"issues\": \"https://github.com/MaiM-with-u/maibot/issues\"\n  },\n  \"changelog\": \"CHANGELOG.md\",\n  \"host_application\": {\n    \"min_version\": \"1.3.0\",\n    \"max_version\": \"1.3.99\"\n  },\n  \"sdk\": {\n    \"min_version\": \"2.0.0\",\n    \"max_version\": \"2.99.99\"\n  },\n  \"dependencies\": [],\n  \"display\": {\n    \"icon\": {\n      \"type\": \"local\",\n      \"value\": \"assets/icon.svg\",\n      \"fallback\": \"puzzle\",\n      \"background\": \"#1C272C\"\n    }\n  },\n  \"capabilities\": [\n    \"send.text\",\n    \"send.forward\",\n    \"send.hybrid\",\n    \"emoji.get_random\",\n    \"config.get\"\n  ],\n  \"i18n\": {\n    \"default_locale\": \"zh-CN\",\n    \"locales_path\": \"_locales\",\n    \"supported_locales\": [\n      \"zh-CN\"\n    ]\n  },\n  \"id\": \"maibot-team.hello-world-plugin\"\n}\n","frontmatter":{"manifest_version":2,"version":"2.0.1","name":"Hello World 示例插件 (模板插件/勿使用)","description":"我的第一个 MaiCore 插件，包含问候功能和时间查询等基础示例","author":{"name":"MaiBot开发团队","url":"https://github.com/MaiM-with-u"},"license":"GPL-v3.0-or-later","urls":{"repository":"https://github.com/MaiM-with-u/maibot","homepage":"https://github.com/MaiM-with-u/maibot","documentation":"https://github.com/MaiM-with-u/maibot","issues":"https://github.com/MaiM-with-u/maibot/issues"},"changelog":"CHANGELOG.md","host_application":{"min_version":"1.3.0","max_version":"1.3.99"},"sdk":{"min_version":"2.0.0","max_version":"2.99.99"},"dependencies":[],"display":{"icon":{"type":"local","value":"assets/icon.svg","fallback":"puzzle","background":"#1C272C"}},"capabilities":["send.text","send.forward","send.hybrid","emoji.get_random","config.get"],"i18n":{"default_locale":"zh-CN","locales_path":"_locales","supported_locales":["zh-CN"]},"id":"maibot-team.hello-world-plugin"},"isInternal":false,"tokens":421,"sizeBytes":1259},{"name":"CHANGELOG.md","path":"plugins/hello_world_plugin/CHANGELOG.md","rawUrl":"https://raw.githubusercontent.com/Mai-with-u/MaiBot/HEAD/plugins/hello_world_plugin/CHANGELOG.md","title":"Hello_world_plugin Skill","category":"anthropic-skill","format":"markdown","content":"# Changelog\n\n## 未发布\n\n### 用户感知功能\n\n- 新增详情与循环示例页：表格行详情、单记录确认删除、动态卡片和空数据条件显示。\n- 新增 Hello World 顶部概览和侧边问候体验页，展示统计卡片、图表、表格与表单组件。\n\n### 开发侧\n\n- 演示 `dialog`、`collapsible`、`repeat`、`when` 及选中行字段到 API 参数的映射。\n- 演示 `webui.json` 与插件静态 API 的绑定、参数校验、操作后刷新和危险操作确认。\n\n## [2.0.0] - 2026-06-26\n\n### 用户感知功能\n\n- 提供问候、时间查询、复读和消息打印等基础示例能力。\n\n### 开发侧\n\n- 演示 Manifest v2、配置模型、Tool、Command、Action 和 EventHandler 的基础写法。\n","isInternal":false,"tokens":257,"sizeBytes":749},{"name":"_manifest.json","path":"src/plugins/built_in/plugin_management/_manifest.json","rawUrl":"https://raw.githubusercontent.com/Mai-with-u/MaiBot/HEAD/src/plugins/built_in/plugin_management/_manifest.json","title":"插件和组件管理 (Plugin and Component Management)","category":"anthropic-skill","format":"json","content":"{\n  \"manifest_version\": 2,\n  \"version\": \"2.2.0\",\n  \"name\": \"插件和组件管理 (Plugin and Component Management)\",\n  \"description\": \"通过系统 API 管理插件和组件的生命周期，包括加载、卸载、启用和禁用等操作。\",\n  \"author\": {\n    \"name\": \"MaiBot团队\",\n    \"url\": \"https://github.com/MaiM-with-u\"\n  },\n  \"license\": \"GPL-v3.0-or-later\",\n  \"urls\": {\n    \"repository\": \"https://github.com/MaiM-with-u/maibot\",\n    \"homepage\": \"https://github.com/MaiM-with-u/maibot\",\n    \"documentation\": \"https://github.com/MaiM-with-u/maibot\",\n    \"issues\": \"https://github.com/MaiM-with-u/maibot/issues\"\n  },\n  \"host_application\": {\n    \"min_version\": \"1.0.0\",\n    \"max_version\": \"999.999.999\"\n  },\n  \"sdk\": {\n    \"min_version\": \"2.0.0\",\n    \"max_version\": \"2.99.99\"\n  },\n  \"dependencies\": [],\n  \"capabilities\": [\n    \"component.get_all_plugins\",\n    \"component.list_loaded_plugins\",\n    \"component.list_registered_plugins\",\n    \"component.enable\",\n    \"component.disable\",\n    \"component.load_plugin\",\n    \"component.unload_plugin\",\n    \"component.reload_plugin\",\n    \"component.update_plugin_config\",\n    \"send.text\",\n    \"config.get\",\n    \"config.get_plugin\"\n  ],\n  \"i18n\": {\n    \"default_locale\": \"zh-CN\",\n    \"locales_path\": \"_locales\",\n    \"supported_locales\": [\n      \"zh-CN\"\n    ]\n  },\n  \"id\": \"builtin.plugin-management\"\n}\n","frontmatter":{"manifest_version":2,"version":"2.2.0","name":"插件和组件管理 (Plugin and Component Management)","description":"通过系统 API 管理插件和组件的生命周期，包括加载、卸载、启用和禁用等操作。","author":{"name":"MaiBot团队","url":"https://github.com/MaiM-with-u"},"license":"GPL-v3.0-or-later","urls":{"repository":"https://github.com/MaiM-with-u/maibot","homepage":"https://github.com/MaiM-with-u/maibot","documentation":"https://github.com/MaiM-with-u/maibot","issues":"https://github.com/MaiM-with-u/maibot/issues"},"host_application":{"min_version":"1.0.0","max_version":"999.999.999"},"sdk":{"min_version":"2.0.0","max_version":"2.99.99"},"dependencies":[],"capabilities":["component.get_all_plugins","component.list_loaded_plugins","component.list_registered_plugins","component.enable","component.disable","component.load_plugin","component.unload_plugin","component.reload_plugin","component.update_plugin_config","send.text","config.get","config.get_plugin"],"i18n":{"default_locale":"zh-CN","locales_path":"_locales","supported_locales":["zh-CN"]},"id":"builtin.plugin-management"},"isInternal":false,"tokens":408,"sizeBytes":1350}],"systemPromptSnippet":"<yakaai_skills repo=\"Mai-with-u/MaiBot\">\n<!-- File: AGENTS.md (Tokens: ~2799 | Category: root-instruction) -->\n# 代码规范\n# import 规范\n在从外部库进行导入时候，请遵循以下顺序：\n1. 对于标准库和第三方库的导入，请按照如下顺序：\n    - 需要使用`from ... import ...`语法的导入放在前面。\n    - 直接使用`import ...`语法的导入放在后面。\n    - 对于使用`from ... import ...`导入的多个项，请**在保证不会引起import错误的前提下**，按照**字母顺序**排列。\n    - 对于使用`import ...`导入的多个项，请**在保证不会引起import错误的前提下**，按照**字母顺序**排列。\n2. 对于本地模块的导入，请按照如下顺序：\n    - 对于同一个文件夹下的模块导入，使用相对导入，排列顺序按照**不发生import错误的前提下**，随便排列。\n    - 对于不同文件夹下的模块导入，使用绝对导入。这些导入应该以`from src`开头，并且按照**不发生import错误的前提下**，尽量使得第二层的文件夹名称相同的导入放在一起；第二层文件夹名称排列随机。\n3. 标准库和第三方库的导入应该放在本地模块导入的前面。\n\n## 注释规范\n1. 如果原来的代码中有注释，则重构的时候，除非这部分代码被删除，否则相同功能的代码应该保留注释（可以对注释进行修改以保持准确性，但不应该删除注释）。\n2. 如果原来的代码中没有注释，则重构的时候，如果某个功能块的代码较长或者逻辑较为复杂，则应该添加注释来解释这部分代码的功能和逻辑。\n## 类型注解规范\n1. 重构代码时，如果原来的代码中有类型注解，则相同功能的代码应该保留类型注解（可以对类型注解进行修改以保持准确性，但不应该删除类型注解）。\n2. 重构代码时，如果原来的代码中没有类型注解，则重构的时候，如果某个函数的功能较为复杂或者参数较多，则应该添加类型注解来提高代码的可读性和可维护性。（对于简单的变量，可以不添加类型注解）\n3. 对于参数化泛型，应该使用`typing`模块中的类型注解来指定参数化泛型的类型。\n    - 例如，使用`List[int]`来表示一个包含整数的列表，使用`Dict[str, Any]`来表示一个键为字符串，值为任意类型的字典。\n\n## 变量规范\n1. 当确定某个变量/实例是某种类型的时候（优先按照类型注解确定，除非你分析出类型注解是错误的），可以不必使用`or`进行fallback。\n    - 例如，`bot_nickname = (global_config.bot.nickname or \"\").strip()` 可以改为 `bot_nickname = global_config.bot.nickname.strip()`，前提是我们确定`global_config.bot.nickname`一定是一个字符串。\n\n## 类属性使用规范\n1. 应该尽量减少使用getattr和setattr方法，除非是在对一个动态类进行处理或者使用Monkeypatch完成Pytest\n2. 在重构代码时，如果遇到getattr和setattr，应该尝试检查这个类实例是否有这个属性，如果有，则直接替换为类属性访问写法。\n    - 举例：`v = getattr(instance, \"value\", \"\")` 在检查到`instance`有`value`属性后应该改为`v = instance.value`\n\n## debug规范\n1. 不要总是想找兜底，一定要精准的找到问题的核心，然后提出建议，兜底是不合适，难以维护的。\n2. 不要总是考虑fallback，如果哪里有错误，一定要让他及时完整的暴露，而不是用fall_back兜底掩盖过去\n\n## 验证与排查纪律\n1. 修 CI 报错先判存量：查父提交同 workflow 的 run 结论，分支早就红的问题不是你刚改的，别先背锅再动手；但若要 CI 转绿，存量失败该修也要修。\n2. 验证适度，高成本验证先缩小范围：全量测试一轮几分钟，先单独跑目标文件；单独跑过、全量下才挂（尤其 waitFor 超时）即环境抖动。回头成本低时按最可能解释先推进，不要为每个结论做 stash 对比、多轮重跑。\n3. 下「环境问题/存量失败」结论前先确认环境一致性：本地依赖与 CI lockfile 不一致（如本地 pnpm、CI bun）会产生假失败；判定以干净装依赖的环境（同 lockfile）为准。\n4. 往沙箱/临时目录复制文件必须保真：PowerShell `Out-File`（尤其 `-NoNewline`）会吞换行制造幽灵失败，用 `Copy-Item` 或 Python 二进制读写；复制后先哈希或 diff 比对再下结论。\n\n# 运行/调试/构建/测试/依赖\n优先使用uv\n依赖项以 pyproject.toml 为准，要同步更新requirements.txt\n\n# Webui规范\n对于dashboard的前端测试，在细节改动，改动范围小时，别测试，别写测试，别build，直接快速做，避免无谓的时间浪费和代码浪费\n修改完webui，如果是小改动小修复，不用急着npm run build。当完成一个较大功能新增或者较广重构时，才需要运行 npm run build。\n\nWebUI 开发服务固定起到 7999 端口。\n\n# 配置文件修改\n如果你需要改动配置文件，不需要修改实际的bot_config.toml或者model_config.toml，只需要修改配置文件模版，并新增一个版本号即可，也不必要为配置改动创建测试文件。\n除非明确说明，否则不要擅自新增 ConfigUpgradeHook\n禁止改动 legacy_migration，此文件以固定\n\n# 事件循环规范\n不要阻塞事件循环。同一进程里有两个事件循环（bot 主循环、WebUI 独立线程的循环），任何一个被同步工作占住，界面上对应的一侧就会整体卡住。\n\n- 路由处理器只做同步工作（查数据库、读文件、算数据）时写成普通 `def`，不要写 `async def`：FastAPI 会把 `def` 端点交给线程池执行，而 `async def` 会占用事件循环。只有确实需要 `await`，或需要「当前有运行中的事件循环」（`asyncio.create_task`、`asyncio.get_running_loop` 等）时，才写 `async def`。\n- `async def` 函数体内不要直接调用同步阻塞接口：`get_db_session()`、`session.exec()`、`find_messages()`、`metadata_store.query()`、批量文件读写等，应放进 `asyncio.to_thread(...)`。\n- WebUI 同步端点的并发数由 `src/webui/app.py` 的 `limit_sync_endpoint_concurrency()` 限制在 SQLite 连接池容量以内，新增同步端点不需要再单独控制并发。\n- 主循环与 WebUI 循环各挂一个卡顿看门狗（`src/common/event_loop_watchdog.py`）。日志里出现「事件循环卡顿: loop=... 迟到=...s」即可看出是哪一侧被阻塞、卡了多久。\n\n# 会话 ID 规范\n除聊天流创建/注册链路外，业务模块不应自行调用 `SessionUtils.calculate_session_id` 计算资源归属 ID。表达学习、黑话、记忆、WebUI、配置匹配等模块应通过 `chat_manager` 的内部接口，基于 platform、目标 ID 和聊天类型解析已存在的真实聊天流；如果解析不到真实 `ChatSession.session_id`，不要把自行计算的 fallback hash 写入数据库。\n\nwebui中设计聊天会话流的，涉及显示聊天流信息的，优先显示聊天流实际名称（群名称或 xxx的私聊），而不是session_id\n\n# 关于 A_memorix 修改\n如果修改涉及 `src/A_memorix`，请先阅读 `src/A_memorix/MODIFICATION_POLICY.md`。\n\n1. `src/A_memorix` 的实现层改动应优先遵守 `src/A_memorix/MODIFICATION_POLICY.md` 中的归属约束。\n2. 不要提交无边界的 `ruff`、格式化、导入整理或大面积实现整理。\n3. 本地实验目录或依赖其运行的测试，除非明确说明并确认，否则不要进入共享历史。\n\n# prompt模板、\n涉及对prompt模板的修改，要同步修改英文和日文的文件，对齐到中文\n\n# maibot插件开发文档\nhttps://github.com/Mai-with-u/maibot-plugin-sdk/blob/main/docs/guide.md\n\n如果你要编写插件，不要改动根目录的.gitignore，而是在/plugins下创建独立仓库，然后进行编写\n如果你要编写插件有需求需要改动主程序代码，请你先请求许可。\n\n# 如何提交maibot插件\nhttps://github.com/Mai-with-u/plugin-repo/blob/main/CONTRIBUTING.md\n\n# changelog编写\n建议分为两部分，一部分是主要功能，一部分是细节（包含修复和插件sdk,api改动）。最好一个功能一行，按模块分。\n不用修改changelog.dev，改动应该都写changelog.md\n一般不写入changelog的内容：\n版本号提升或更新项目依赖\n\n<!-- File: plugins/hello_world_plugin/_manifest.json (Tokens: ~421 | Category: anthropic-skill) -->\n{\n  \"manifest_version\": 2,\n  \"version\": \"2.0.1\",\n  \"name\": \"Hello World 示例插件 (模板插件/勿使用)\",\n  \"description\": \"我的第一个 MaiCore 插件，包含问候功能和时间查询等基础示例\",\n  \"author\": {\n    \"name\": \"MaiBot开发团队\",\n    \"url\": \"https://github.com/MaiM-with-u\"\n  },\n  \"license\": \"GPL-v3.0-or-later\",\n  \"urls\": {\n    \"repository\": \"https://github.com/MaiM-with-u/maibot\",\n    \"homepage\": \"https://github.com/MaiM-with-u/maibot\",\n    \"documentation\": \"https://github.com/MaiM-with-u/maibot\",\n    \"issues\": \"https://github.com/MaiM-with-u/maibot/issues\"\n  },\n  \"changelog\": \"CHANGELOG.md\",\n  \"host_application\": {\n    \"min_version\": \"1.3.0\",\n    \"max_version\": \"1.3.99\"\n  },\n  \"sdk\": {\n    \"min_version\": \"2.0.0\",\n    \"max_version\": \"2.99.99\"\n  },\n  \"dependencies\": [],\n  \"display\": {\n    \"icon\": {\n      \"type\": \"local\",\n      \"value\": \"assets/icon.svg\",\n      \"fallback\": \"puzzle\",\n      \"background\": \"#1C272C\"\n    }\n  },\n  \"capabilities\": [\n    \"send.text\",\n    \"send.forward\",\n    \"send.hybrid\",\n    \"emoji.get_random\",\n    \"config.get\"\n  ],\n  \"i18n\": {\n    \"default_locale\": \"zh-CN\",\n    \"locales_path\": \"_locales\",\n    \"supported_locales\": [\n      \"zh-CN\"\n    ]\n  },\n  \"id\": \"maibot-team.hello-world-plugin\"\n}\n\n<!-- File: plugins/hello_world_plugin/CHANGELOG.md (Tokens: ~257 | Category: anthropic-skill) -->\n# Changelog\n\n## 未发布\n\n### 用户感知功能\n\n- 新增详情与循环示例页：表格行详情、单记录确认删除、动态卡片和空数据条件显示。\n- 新增 Hello World 顶部概览和侧边问候体验页，展示统计卡片、图表、表格与表单组件。\n\n### 开发侧\n\n- 演示 `dialog`、`collapsible`、`repeat`、`when` 及选中行字段到 API 参数的映射。\n- 演示 `webui.json` 与插件静态 API 的绑定、参数校验、操作后刷新和危险操作确认。\n\n## [2.0.0] - 2026-06-26\n\n### 用户感知功能\n\n- 提供问候、时间查询、复读和消息打印等基础示例能力。\n\n### 开发侧\n\n- 演示 Manifest v2、配置模型、Tool、Command、Action 和 EventHandler 的基础写法。\n\n<!-- File: src/plugins/built_in/plugin_management/_manifest.json (Tokens: ~408 | Category: anthropic-skill) -->\n{\n  \"manifest_version\": 2,\n  \"version\": \"2.2.0\",\n  \"name\": \"插件和组件管理 (Plugin and Component Management)\",\n  \"description\": \"通过系统 API 管理插件和组件的生命周期，包括加载、卸载、启用和禁用等操作。\",\n  \"author\": {\n    \"name\": \"MaiBot团队\",\n    \"url\": \"https://github.com/MaiM-with-u\"\n  },\n  \"license\": \"GPL-v3.0-or-later\",\n  \"urls\": {\n    \"repository\": \"https://github.com/MaiM-with-u/maibot\",\n    \"homepage\": \"https://github.com/MaiM-with-u/maibot\",\n    \"documentation\": \"https://github.com/MaiM-with-u/maibot\",\n    \"issues\": \"https://github.com/MaiM-with-u/maibot/issues\"\n  },\n  \"host_application\": {\n    \"min_version\": \"1.0.0\",\n    \"max_version\": \"999.999.999\"\n  },\n  \"sdk\": {\n    \"min_version\": \"2.0.0\",\n    \"max_version\": \"2.99.99\"\n  },\n  \"dependencies\": [],\n  \"capabilities\": [\n    \"component.get_all_plugins\",\n    \"component.list_loaded_plugins\",\n    \"component.list_registered_plugins\",\n    \"component.enable\",\n    \"component.disable\",\n    \"component.load_plugin\",\n    \"component.unload_plugin\",\n    \"component.reload_plugin\",\n    \"component.update_plugin_config\",\n    \"send.text\",\n    \"config.get\",\n    \"config.get_plugin\"\n  ],\n  \"i18n\": {\n    \"default_locale\": \"zh-CN\",\n    \"locales_path\": \"_locales\",\n    \"supported_locales\": [\n      \"zh-CN\"\n    ]\n  },\n  \"id\": \"builtin.plugin-management\"\n}\n</yakaai_skills>"}