You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

128 lines
4.0 KiB

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 'eaicar/module.dart';
import 'text_translation/module.dart';
import 'translation/module.dart';
/// **Agent 模块的唯一注册点。**
///
/// 新增一个能力模块:
/// 1. 建 `lib/modules/<name>/`,在 `module.dart` 里导出一个 [AgentModuleDescriptor];
/// 2. 在下面 [all] 里加一行。
///
/// 路由、卡片跳转、端侧指令、文案、常驻服务都由描述符自带,
/// 不用再去改 `app_pages.dart` / `module_card.dart` / `assistant_directive_service.dart`
/// / 41 个语言文件。
class ModuleRegistry {
ModuleRegistry._();
static final List<AgentModuleDescriptor> all = <AgentModuleDescriptor>[
meetingModule,
emaiModule,
...translationModules,
...callRecordingModules,
textTranslationModule,
pictureTranslationModule,
eaicarModule,
// ---------- 规划中(占位,方便测试增删) ----------
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<GetPage> get pages {
final seen = <String>{};
final out = <GetPage>[];
for (final m in all) {
for (final p in m.pages) {
if (seen.add(p.name)) out.add(p);
}
}
return out;
}
/// 端侧指令 → 处理器。同名指令后注册的覆盖先注册的并报警。
static Map<String, DirectiveHandler> get directiveHandlers {
final out = <String, DirectiveHandler>{};
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<String, Map<String, String>> mergeTranslations(
Map<String, Map<String, String>> base) {
final out = <String, Map<String, String>>{
for (final e in base.entries) e.key: Map<String, String>.from(e.value),
};
for (final m in all) {
for (final loc in m.translations.entries) {
out.putIfAbsent(loc.key, () => <String, String>{}).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');
}
}
}
}