execute method
Execute the tool with the given input.
Implementation
@override
Future<ToolResult> execute(Map<String, dynamic> input) async {
final validation = validateInput(input);
if (!validation.isValid) return ToolResult.error(validation.error!);
final parsed = MemoryToolInput.fromJson(input);
switch (parsed.action) {
case 'read':
final file = File(parsed.path!);
if (!await file.exists()) {
return ToolResult.error('Memory file not found: ${parsed.path}');
}
final content = await file.readAsString();
return ToolResult.success(content);
case 'write':
final file = File(parsed.path!);
await file.parent.create(recursive: true);
await file.writeAsString(parsed.content!);
return ToolResult.success('Memory written to ${parsed.path}');
case 'append':
final file = File(parsed.path!);
await file.parent.create(recursive: true);
await file.writeAsString(parsed.content!, mode: FileMode.append);
return ToolResult.success('Appended to ${parsed.path}');
case 'list':
// List NEOMAGE.md files in common locations.
final candidates = [
'NEOMAGE.md',
'.neomage/NEOMAGE.md',
'.neomage/memory/',
];
final found = <String>[];
for (final c in candidates) {
final entity = FileSystemEntity.typeSync(c);
if (entity == FileSystemEntityType.file) {
found.add(c);
} else if (entity == FileSystemEntityType.directory) {
await for (final f in Directory(c).list()) {
if (f is File && f.path.endsWith('.md')) {
found.add(f.path);
}
}
}
}
return found.isEmpty
? ToolResult.success('No memory files found')
: ToolResult.success(found.join('\n'));
default:
return ToolResult.error('Unknown action: ${parsed.action}');
}
}