convertSDKMessage function

ConvertedMessage convertSDKMessage(
  1. SessionsMessage msg, {
  2. ConvertOptions options = const ConvertOptions(),
})

Convert a SessionsMessage (SDK format) to a ConvertedMessage.

The CCR backend sends SDK-format messages via WebSocket. The Flutter UI expects internal Message types for rendering. This function bridges the two.

Implementation

ConvertedMessage convertSDKMessage(
  SessionsMessage msg, {
  ConvertOptions options = const ConvertOptions(),
}) {
  switch (msg.type) {
    case 'assistant':
      return ConvertedDisplayMessage(_convertAssistantMessage(msg));

    case 'user':
      final rawContent =
          (msg.raw['message'] as Map<String, dynamic>?)?['content'];
      final isToolResult = rawContent is List &&
          rawContent.any(
            (b) => b is Map<String, dynamic> && b['type'] == 'tool_result',
          );

      if (options.convertToolResults && isToolResult) {
        return ConvertedDisplayMessage(_buildUserMessage(msg));
      }
      if (options.convertUserTextMessages && !isToolResult) {
        return ConvertedDisplayMessage(_buildUserMessage(msg));
      }
      return const ConvertedIgnored();

    case 'stream_event':
      final event = msg.raw['event'] as Map<String, dynamic>? ?? msg.raw;
      return ConvertedStreamEvent(event);

    case 'result':
      final converted = _convertResultMessage(msg);
      return converted != null
          ? ConvertedDisplayMessage(converted)
          : const ConvertedIgnored();

    case 'system':
      final subtype = msg.raw['subtype'] as String?;
      return switch (subtype) {
        'init' => ConvertedDisplayMessage(_convertInitMessage(msg)),
        'status' => () {
            final m = _convertStatusMessage(msg);
            return m != null
                ? ConvertedDisplayMessage(m)
                : const ConvertedIgnored();
          }(),
        'compact_boundary' =>
          ConvertedDisplayMessage(_convertCompactBoundaryMessage(msg)),
        _ => () {
            developer.log(
              'Ignoring system message subtype: $subtype',
              name: 'sdkMessageAdapter',
            );
            return const ConvertedIgnored();
          }(),
      };

    case 'tool_progress':
      return ConvertedDisplayMessage(_convertToolProgressMessage(msg));

    case 'auth_status':
    case 'tool_use_summary':
    case 'rate_limit_event':
      developer.log(
        'Ignoring ${msg.type} message',
        name: 'sdkMessageAdapter',
      );
      return const ConvertedIgnored();

    default:
      developer.log(
        'Unknown message type: ${msg.type}',
        name: 'sdkMessageAdapter',
      );
      return const ConvertedIgnored();
  }
}