xworkmate-app/lib/runtime/multi_agent_frameworks.dart

114 lines
2.7 KiB
Dart
Raw Normal View History

import 'dart:io';
import 'aris_bundle.dart';
import 'runtime_models.dart';
abstract class FrameworkPreset {
const FrameworkPreset();
String get id;
String get label;
Future<String> roleInstructionBlock({
required MultiAgentRole role,
required String tool,
required List<String> selectedSkills,
});
}
class NativeFrameworkPreset extends FrameworkPreset {
const NativeFrameworkPreset();
@override
String get id => MultiAgentFramework.native.name;
@override
String get label => MultiAgentFramework.native.label;
@override
Future<String> roleInstructionBlock({
required MultiAgentRole role,
required String tool,
required List<String> selectedSkills,
}) async {
final selected = selectedSkills.isEmpty
? '- 无'
: selectedSkills.map((item) => '- $item').join('\n');
return '''
$label
${role.label}
$tool
$selected
''';
}
}
class ArisFrameworkPreset extends FrameworkPreset {
ArisFrameworkPreset(this._bundleRepository);
final ArisBundleRepository _bundleRepository;
@override
String get id => MultiAgentFramework.aris.name;
@override
String get label => MultiAgentFramework.aris.label;
@override
Future<String> roleInstructionBlock({
required MultiAgentRole role,
required String tool,
required List<String> selectedSkills,
}) async {
final bundle = await _bundleRepository.ensureReady();
final preferCodex = tool.trim().toLowerCase() == 'codex';
final skillPaths = bundle.skillPathsForRole(role, preferCodex: preferCodex);
final skillDocs = await _bundleRepository.loadSkillContents(skillPaths);
final selected = selectedSkills.isEmpty
? '- 无'
: selectedSkills.map((item) => '- $item').join('\n');
final excerpts = skillDocs.entries
.map(
(entry) => _formatSkillExcerpt(
path: entry.key,
content: entry.value,
),
)
.join('\n\n');
return '''
$label
${role.label}
$tool
ARIS bundle${bundle.manifest.bundleVersion}
$selected
ARIS
$excerpts
''';
}
String _formatSkillExcerpt({
required String path,
required String content,
}) {
final label = File(path).parent.uri.pathSegments
.where((item) => item.isNotEmpty)
.last;
final lines = content
.split('\n')
.map((line) => line.trimRight())
.where((line) => line.isNotEmpty)
.take(60)
.join('\n');
return '''
## $label
$path
$lines
''';
}
}