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.bundleRepositoryInternal);
final ArisBundleRepository bundleRepositoryInternal;
@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 bundleRepositoryInternal.ensureReady();
final preferCodex = tool.trim().toLowerCase() == 'codex';
final skillPaths = bundle.skillPathsForRole(role, preferCodex: preferCodex);
final skillDocs = await bundleRepositoryInternal.loadSkillContents(
skillPaths,
);
final selected = selectedSkills.isEmpty
? '- 无'
: selectedSkills.map((item) => '- $item').join('\n');
final excerpts = skillDocs.entries
.map(
(entry) =>
formatSkillExcerptInternal(path: entry.key, content: entry.value),
)
.join('\n\n');
return '''
$label
${role.label}
$tool
ARIS bundle${bundle.manifest.bundleVersion}
$selected
ARIS
$excerpts
''';
}
String formatSkillExcerptInternal({
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
''';
}
}