getEnhancedPrAttribution function

Future<String> getEnhancedPrAttribution({
  1. required AttributionAppState getAppState(),
  2. required String? userType,
  3. required bool isUndercover(),
  4. required String getClientType(),
  5. required String? remoteSessionId,
  6. required String? ingressUrl,
  7. required bool isRemoteSessionLocal(
    1. String,
    2. String?
    ),
  8. required String getRemoteSessionUrl(
    1. String,
    2. String?
    ),
  9. required AttributionSettings getInitialSettings(),
  10. required String getCanonicalName(
    1. String
    ),
  11. required String getMainLoopModel(),
  12. required String sanitizeModelName(
    1. String
    ),
  13. required Future<bool> isInternalModelRepo(),
  14. required Future<AttributionData?> getAttributionData(
    1. AttributionAppState
    ),
  15. required Future<TranscriptStats> getTranscriptStats(),
})

Get enhanced PR attribution text with Neomage contribution stats.

Format: "Generated with Neomage (93% 3-shotted by claude-opus-4-5)"

Rules:

  • Shows Neomage contribution percentage from commit attribution
  • Shows N-shotted where N is the prompt count
  • Shows short model name
  • Returns default attribution if stats can't be computed

Implementation

Future<String> getEnhancedPrAttribution({
  required AttributionAppState Function() getAppState,
  required String? userType,
  required bool Function() isUndercover,
  required String Function() getClientType,
  required String? remoteSessionId,
  required String? ingressUrl,
  required bool Function(String, String?) isRemoteSessionLocal,
  required String Function(String, String?) getRemoteSessionUrl,
  required AttributionSettings Function() getInitialSettings,
  required String Function(String) getCanonicalName,
  required String Function() getMainLoopModel,
  required String Function(String) sanitizeModelName,
  required Future<bool> Function() isInternalModelRepo,
  required Future<AttributionData?> Function(AttributionAppState)
  getAttributionData,
  required Future<TranscriptStats> Function() getTranscriptStats,
}) async {
  if (userType == 'ant' && isUndercover()) {
    return '';
  }

  if (getClientType() == 'remote') {
    if (remoteSessionId != null) {
      if (!isRemoteSessionLocal(remoteSessionId, ingressUrl)) {
        return getRemoteSessionUrl(remoteSessionId, ingressUrl);
      }
    }
    return '';
  }

  final settings = getInitialSettings();

  // If user has custom PR attribution, use that.
  if (settings.attribution?.pr != null) {
    return settings.attribution!.pr!;
  }

  // Backward compatibility: deprecated includeCoAuthoredBy setting.
  if (settings.includeCoAuthoredBy == false) {
    return '';
  }

  const defaultAttribution =
      'Generated with [Neomage](https://github.com/Open-Neom/neomage)';

  // Get AppState.
  final appState = getAppState();

  // Get attribution stats in parallel.
  final results = await Future.wait([
    getAttributionData(appState),
    getTranscriptStats(),
    isInternalModelRepo(),
  ]);

  final attributionData = results[0] as AttributionData?;
  final transcriptStats = results[1] as TranscriptStats;
  final isInternal = results[2] as bool;

  final neomagePercent = attributionData?.summary.neomagePercent ?? 0;
  final promptCount = transcriptStats.promptCount;
  final memoryAccessCount = transcriptStats.memoryAccessCount;

  // Get short model name, sanitized for non-internal repos.
  final rawModelName = getCanonicalName(getMainLoopModel());
  final shortModelName = isInternal
      ? rawModelName
      : sanitizeModelName(rawModelName);

  // If no attribution data, return default.
  if (neomagePercent == 0 && promptCount == 0 && memoryAccessCount == 0) {
    return defaultAttribution;
  }

  // Build the enhanced attribution.
  final memSuffix = memoryAccessCount > 0
      ? ', $memoryAccessCount ${memoryAccessCount == 1 ? 'memory' : 'memories'} recalled'
      : '';
  final summary =
      'Generated with [Neomage](https://github.com/Open-Neom/neomage) '
      '($neomagePercent% $promptCount-shotted by $shortModelName$memSuffix)';

  return summary;
}