extractFromMessage method

List<ExtractedMemory> extractFromMessage(
  1. String message, {
  2. String? sessionId,
})

Extract potential memories from a conversation message.

Implementation

List<ExtractedMemory> extractFromMessage(
  String message, {
  String? sessionId,
}) {
  final extracted = <ExtractedMemory>[];
  final now = DateTime.now();

  // Pattern: "always/never do X" — coding conventions.
  final conventionPatterns = [
    RegExp(
      r'(?:always|never|prefer|avoid)\s+(?:use|using|do|doing)\s+(.+)',
      caseSensitive: false,
    ),
    RegExp(
      r'(?:the|our)\s+(?:convention|standard|pattern|rule)\s+is\s+(.+)',
      caseSensitive: false,
    ),
    RegExp(
      r'(?:we|you should)\s+(?:always|never)\s+(.+)',
      caseSensitive: false,
    ),
  ];

  for (final pattern in conventionPatterns) {
    for (final match in pattern.allMatches(message)) {
      extracted.add(
        ExtractedMemory(
          content: match.group(0)!.trim(),
          source: 'auto_detected',
          category: MemoryCategory.codingConventions,
          confidence: 0.7,
          sessionId: sessionId,
          extractedAt: now,
        ),
      );
    }
  }

  // Pattern: build/run/test commands.
  final commandPatterns = [
    RegExp(
      r'(?:run|build|test|deploy|install)\s+(?:with|using|via)\s+[`"]?(.+?)[`"]?$',
      caseSensitive: false,
      multiLine: true,
    ),
    RegExp(
      r'(?:use|run)\s+[`"](.+?)[`"]\s+to\s+(?:build|test|deploy)',
      caseSensitive: false,
    ),
  ];

  for (final pattern in commandPatterns) {
    for (final match in pattern.allMatches(message)) {
      extracted.add(
        ExtractedMemory(
          content: match.group(0)!.trim(),
          source: 'auto_detected',
          category: MemoryCategory.buildInstructions,
          confidence: 0.6,
          sessionId: sessionId,
          extractedAt: now,
        ),
      );
    }
  }

  // Pattern: architecture/structure mentions.
  final archPatterns = [
    RegExp(
      r'(?:the architecture|the structure|organized as|follows?\s+(?:MVC|MVVM|clean architecture|hexagonal))',
      caseSensitive: false,
    ),
  ];

  for (final pattern in archPatterns) {
    for (final match in pattern.allMatches(message)) {
      extracted.add(
        ExtractedMemory(
          content: match.group(0)!.trim(),
          source: 'auto_detected',
          category: MemoryCategory.architecture,
          confidence: 0.5,
          sessionId: sessionId,
          extractedAt: now,
        ),
      );
    }
  }

  _extractedMemories.addAll(extracted);
  for (final e in extracted) {
    _eventController.add(MemoryExtracted(e));
  }

  return extracted;
}