execute method

  1. @override
Future<ToolResult> execute(
  1. Map<String, dynamic> input
)
override

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}');
  }
}