execute method

  1. @override
Future<CommandResult> execute(
  1. String args,
  2. ToolUseContext context
)
override

Execute the command.

Implementation

@override
Future<CommandResult> execute(String args, ToolUseContext context) async {
  final conversation = getConversation();
  if (conversation.isEmpty) {
    return const TextCommandResult(
      'Nothing to export — conversation is empty.',
    );
  }

  final timestamp = DateTime.now()
      .toIso8601String()
      .replaceAll(':', '-')
      .split('.')
      .first;
  final filename = args.trim().isNotEmpty
      ? args.trim()
      : 'conversation-$timestamp.md';

  final path = filename.startsWith('/')
      ? filename
      : '${context.cwd}/$filename';

  try {
    final buffer = StringBuffer();
    buffer.writeln('# Conversation Export');
    buffer.writeln();
    buffer.writeln('Exported: ${DateTime.now().toIso8601String()}');
    buffer.writeln();
    buffer.writeln('---');
    buffer.writeln();

    for (final msg in conversation) {
      final role = msg['role'] ?? 'unknown';
      final content = msg['content'] ?? '';
      final roleLabel = role == 'user' ? 'User' : 'Assistant';

      buffer.writeln('## $roleLabel');
      buffer.writeln();
      buffer.writeln(content);
      buffer.writeln();
      buffer.writeln('---');
      buffer.writeln();
    }

    final file = File(path);
    await file.writeAsString(buffer.toString());
    return TextCommandResult('Conversation exported to: $path');
  } catch (e) {
    return TextCommandResult('Export failed: $e');
  }
}