< Summary

Information
Class: Elsa.AI.Copilot.Adapters.CopilotSessionEventMapper
Assembly: Elsa.AI.Copilot
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Copilot/Adapters/CopilotSessionEventMapper.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 67
Coverable lines: 67
Total lines: 89
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 76
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Map()0%5550740%
Create(...)100%210%
ReadToolName(...)0%620%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Copilot/Adapters/CopilotSessionEventMapper.cs

#LineLine coverage
 1using System.Text.Json;
 2using Elsa.AI.Abstractions.Models;
 3using GitHub.Copilot;
 4
 5namespace Elsa.AI.Copilot.Adapters;
 6
 7public class CopilotSessionEventMapper
 8{
 9    public IEnumerable<AIProviderEvent> Map(SessionEvent sessionEvent)
 10    {
 011        var timestamp = sessionEvent.Timestamp == default ? DateTimeOffset.UtcNow : sessionEvent.Timestamp;
 012        var sequence = 0L;
 13
 014        switch (sessionEvent)
 15        {
 016            case AssistantMessageDeltaEvent assistantDelta when !string.IsNullOrEmpty(assistantDelta.Data?.DeltaContent)
 017                yield return Create("assistant.delta", sequence++, timestamp, new JsonObject
 018                {
 019                    ["content"] = assistantDelta.Data.DeltaContent,
 020                    ["messageId"] = assistantDelta.Data.MessageId,
 021                    ["parentToolCallId"] = assistantDelta.Data.ParentToolCallId
 022                });
 023                break;
 024            case AssistantMessageEvent assistantMessage when !string.IsNullOrEmpty(assistantMessage.Data?.Content):
 025                yield return Create("assistant.message", sequence++, timestamp, new JsonObject
 026                {
 027                    ["content"] = assistantMessage.Data.Content,
 028                    ["messageId"] = assistantMessage.Data.MessageId,
 029                    ["model"] = assistantMessage.Data.Model,
 030                    ["turnId"] = assistantMessage.Data.TurnId
 031                });
 032                break;
 033            case AssistantReasoningDeltaEvent reasoningDelta when !string.IsNullOrEmpty(reasoningDelta.Data?.DeltaConten
 034                yield return Create("assistant.reasoning.delta", sequence++, timestamp, new JsonObject
 035                {
 036                    ["content"] = reasoningDelta.Data.DeltaContent,
 037                    ["reasoningId"] = reasoningDelta.Data.ReasoningId
 038                });
 039                break;
 040            case AssistantReasoningEvent reasoning when !string.IsNullOrEmpty(reasoning.Data?.Content):
 041                yield return Create("assistant.reasoning", sequence++, timestamp, new JsonObject
 042                {
 043                    ["content"] = reasoning.Data.Content,
 044                    ["reasoningId"] = reasoning.Data.ReasoningId
 045                });
 046                break;
 47            case ToolExecutionStartEvent toolStart:
 048                yield return Create("tool.started", sequence++, timestamp, new JsonObject
 049                {
 050                    ["toolCallId"] = toolStart.Data?.ToolCallId,
 051                    ["toolName"] = ReadToolName(toolStart.Data?.ToolName, toolStart.Data?.McpToolName),
 052                    ["mcpServerName"] = toolStart.Data?.McpServerName,
 053                    ["arguments"] = toolStart.Data?.Arguments is { } arguments ? JsonNode.Parse(arguments.GetRawText()) 
 054                });
 055                break;
 56            case ToolExecutionCompleteEvent toolComplete:
 057                yield return Create("tool.result", sequence++, timestamp, new JsonObject
 058                {
 059                    ["toolCallId"] = toolComplete.Data?.ToolCallId,
 060                    ["toolName"] = ReadToolName(toolComplete.Data?.ToolDescription?.Name, null),
 061                    ["status"] = toolComplete.Data?.Success == false ? AIToolInvocationStatus.Failed.ToString() : AITool
 062                    ["summary"] = toolComplete.Data?.Result?.Content ?? "",
 063                    ["error"] = toolComplete.Data?.Error?.Message
 064                });
 065                break;
 66            case SessionErrorEvent error:
 067                yield return Create("conversation.error", sequence++, timestamp, new JsonObject
 068                {
 069                    ["content"] = error.Data?.Message ?? "Copilot session error.",
 070                    ["errorCode"] = error.Data?.ErrorCode,
 071                    ["errorType"] = error.Data?.ErrorType,
 072                    ["statusCode"] = error.Data?.StatusCode
 073                });
 74                break;
 75        }
 076    }
 77
 78    private static AIProviderEvent Create(string type, long sequence, DateTimeOffset timestamp, JsonObject data) =>
 079        new()
 080        {
 081            Type = type,
 082            Sequence = sequence,
 083            Timestamp = timestamp,
 084            Data = data
 085        };
 86
 87    private static string? ReadToolName(string? toolName, string? mcpToolName) =>
 088        !string.IsNullOrWhiteSpace(toolName) ? toolName : mcpToolName;
 89}