import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../core/utils/logger.dart'; import '../data/models/agent_module.dart'; import 'call_recording/module.dart'; import 'emai/module.dart'; import 'meeting/module.dart'; import 'module_descriptor.dart'; import 'picture_translation/module.dart'; import 'smartcar/module.dart'; import 'text_translation/module.dart'; import 'translation/module.dart'; /// **Agent 模块的唯一注册点。** /// /// 新增一个能力模块: /// 1. 建 `lib/modules//`,在 `module.dart` 里导出一个 [AgentModuleDescriptor]; /// 2. 在下面 [all] 里加一行。 /// /// 路由、卡片跳转、端侧指令、文案、常驻服务都由描述符自带, /// 不用再去改 `app_pages.dart` / `module_card.dart` / `assistant_directive_service.dart` /// / 41 个语言文件。 class ModuleRegistry { ModuleRegistry._(); static final List all = [ meetingModule, emaiModule, ...translationModules, ...callRecordingModules, textTranslationModule, pictureTranslationModule, smartcarModule, // ---------- 规划中(占位,方便测试增删) ---------- AgentModuleDescriptor( id: 'englishChat', title: 'agentEnglishChat', subtitle: 'agentEnglishChatDesc', icon: Icons.chat_bubble_outline, gradient: const [Color(0xFF7E57C2), Color(0xFF5E35B1)], comingSoon: true, ), AgentModuleDescriptor( id: 'englishStudy', title: 'agentEnglishStudy', subtitle: 'agentEnglishStudyDesc', icon: Icons.menu_book, gradient: const [Color(0xFF29B6F6), Color(0xFF0288D1)], comingSoon: true, ), AgentModuleDescriptor( id: 'kidsStory', title: 'agentKidsStory', subtitle: 'agentKidsStoryDesc', icon: Icons.auto_stories, gradient: const [Color(0xFFFF7043), Color(0xFFF4511E)], comingSoon: true, ), ]; /// 启动时调用一次:把注册表交给 data 层的 [AgentModules], /// AgentModuleService / 广场页 / 设备品类默认编排都从那里读。 static void install() { AgentModules.all = all; } static AgentModuleDescriptor? byId(String id) { for (final m in all) { if (m.id == id) return m; } return null; } /// 全部模块自带的页面(按 name 去重:同一模块的多个描述符共用一组页面) static List get pages { final seen = {}; final out = []; for (final m in all) { for (final p in m.pages) { if (seen.add(p.name)) out.add(p); } } return out; } /// 端侧指令 → 处理器。同名指令后注册的覆盖先注册的并报警。 static Map get directiveHandlers { final out = {}; for (final m in all) { for (final e in m.directives.entries) { if (out.containsKey(e.key)) { Logger.w('ModuleRegistry', '指令 ${e.key} 被 ${m.id} 重复注册,以后者为准'); } out[e.key] = e.value; } } return out; } /// 把各模块自带文案合并进全局语言表(模块的覆盖全局的同名 key)。 static Map> mergeTranslations( Map> base) { final out = >{ for (final e in base.entries) e.key: Map.from(e.value), }; for (final m in all) { for (final loc in m.translations.entries) { out.putIfAbsent(loc.key, () => {}).addAll(loc.value); } } return out; } /// 各模块的常驻服务注册。只跑一次。 static bool _servicesRegistered = false; static void registerServices() { if (_servicesRegistered) return; _servicesRegistered = true; for (final m in all) { try { m.registerServices?.call(); } catch (e) { Logger.e('ModuleRegistry', '模块 ${m.id} 注册服务失败: $e'); } } } }