diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e3c64a..f7b3929 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,6 +46,7 @@ jobs: run: | dotnet test WorkflowFramework.slnx \ --configuration Release \ + --no-restore \ --filter "Category!=E2E&Category!=UI" \ --collect:"XPlat Code Coverage" \ -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura \ @@ -159,6 +160,7 @@ jobs: run: | dotnet test WorkflowFramework.slnx \ --configuration Release \ + --no-restore \ --filter "Category!=E2E&Category!=UI" \ --collect:"XPlat Code Coverage" \ -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura \ diff --git a/.gitignore b/.gitignore index 805d873..704aa48 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,8 @@ docs/api/ *.db *.db-shm *.db-wal + +# Aspire AppHost and UITests use RestorePackagesWithLockFile=false; exclude their +# ephemeral lock files that --use-lock-file can create at restore time. +src/WorkflowFramework.Dashboard.AppHost/packages.lock.json +tests/WorkflowFramework.Dashboard.UITests/packages.lock.json diff --git a/benchmarks/WorkflowFramework.Benchmarks/packages.lock.json b/benchmarks/WorkflowFramework.Benchmarks/packages.lock.json index 4c4c9c2..194344e 100644 --- a/benchmarks/WorkflowFramework.Benchmarks/packages.lock.json +++ b/benchmarks/WorkflowFramework.Benchmarks/packages.lock.json @@ -60,7 +60,9 @@ "resolved": "4.14.0", "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==", "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.11.0" + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "System.Collections.Immutable": "9.0.0", + "System.Reflection.Metadata": "9.0.0" } }, "Microsoft.Diagnostics.NETCore.Client": { @@ -85,7 +87,12 @@ "contentHash": "/OrJFKaojSR6TkUKtwh8/qA9XWNtxLrXMqvEb89dBSKCWjaGVTbKMYodIUgF5deCEtmd6GXuRerciXGl5bhZ7Q==", "dependencies": { "Microsoft.Diagnostics.NETCore.Client": "0.2.510501", - "System.Reflection.TypeExtensions": "4.7.0" + "Microsoft.Win32.Registry": "5.0.0", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "8.0.5" } }, "Microsoft.DotNet.PlatformAbstractions": { @@ -126,7 +133,8 @@ "Microsoft.Extensions.DependencyInjection": "6.0.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" } }, "Microsoft.Extensions.Primitives": { @@ -134,11 +142,25 @@ "resolved": "10.0.3", "contentHash": "GEcpTwo7sUoLGGNTqV1FZEuL+tTD9m81NX/mh099dqGNna07/UGZShKQNZRw4hv6nlliSUwYQgSYc7OR99Jufg==" }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, "Perfolizer": { "type": "Transitive", "resolved": "0.6.1", @@ -157,6 +179,11 @@ "resolved": "9.0.5", "contentHash": "cuzLM2MWutf9ZBEMPYYfd0DXwYdvntp7VCT6a/wvbKCa2ZuvGmW74xi+YBa2mrfEieAXqM4TNKlMmSnfAfpUoQ==" }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "QhkXUl2gNrQtvPmtBTQHb0YsUrDiDQ2QS09YbtTTiSjGcf7NBqtYbrG/BE06zcBPCKEwQGzIv13IVdXNOSub2w==" + }, "System.Management": { "type": "Transitive", "resolved": "9.0.5", @@ -165,11 +192,35 @@ "System.CodeDom": "9.0.5" } }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "ANiqLu3DxW9kol/hMmTWbt3414t9ftdIuiIU7j80okq2YzAueo120M442xk1kDJWtmZTqWQn7wHDvMRipVOEOQ==" + }, "System.Reflection.TypeExtensions": { "type": "Transitive", "resolved": "4.7.0", "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, "workflowframework": { "type": "Project", "dependencies": { @@ -181,6 +232,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -197,7 +249,9 @@ "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==", "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.11.0", - "Microsoft.CodeAnalysis.Common": "[4.14.0]" + "Microsoft.CodeAnalysis.Common": "[4.14.0]", + "System.Collections.Immutable": "9.0.0", + "System.Reflection.Metadata": "9.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -206,7 +260,8 @@ "resolved": "6.0.0", "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { @@ -246,6 +301,18 @@ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", "Microsoft.Extensions.Primitives": "10.0.3" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" } }, "net8.0": { diff --git a/samples/WorkflowFramework.Samples.TaskStream/packages.lock.json b/samples/WorkflowFramework.Samples.TaskStream/packages.lock.json index bfc5de5..ec60e7b 100644 --- a/samples/WorkflowFramework.Samples.TaskStream/packages.lock.json +++ b/samples/WorkflowFramework.Samples.TaskStream/packages.lock.json @@ -110,7 +110,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -222,7 +223,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "System.ClientModel": { @@ -239,6 +241,11 @@ "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", @@ -269,6 +276,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -300,6 +308,18 @@ "Microsoft.SemanticKernel.Connectors.AzureOpenAI": "1.71.0", "Microsoft.SemanticKernel.Core": "1.71.0" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.0", + "contentHash": "1Dpjwq9peG/Wt5BNbrzIhTpclfOSqBWZsUO28vVr59yQlkvL5jLBWfpfzRmJ1OY+6DciaY0DUcltyzs4fuZHjw==" } } } diff --git a/samples/WorkflowFramework.Samples.VoiceWorkflows/packages.lock.json b/samples/WorkflowFramework.Samples.VoiceWorkflows/packages.lock.json index 2c6cce0..df3dda3 100644 --- a/samples/WorkflowFramework.Samples.VoiceWorkflows/packages.lock.json +++ b/samples/WorkflowFramework.Samples.VoiceWorkflows/packages.lock.json @@ -110,7 +110,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -222,7 +223,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "System.ClientModel": { @@ -239,6 +241,11 @@ "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", @@ -255,6 +262,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -313,6 +321,18 @@ "Microsoft.SemanticKernel.Connectors.AzureOpenAI": "1.71.0", "Microsoft.SemanticKernel.Core": "1.71.0" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.0", + "contentHash": "1Dpjwq9peG/Wt5BNbrzIhTpclfOSqBWZsUO28vVr59yQlkvL5jLBWfpfzRmJ1OY+6DciaY0DUcltyzs4fuZHjw==" } } } diff --git a/samples/WorkflowFramework.Samples.WebApi/packages.lock.json b/samples/WorkflowFramework.Samples.WebApi/packages.lock.json index d6b3dec..b8aa7e8 100644 --- a/samples/WorkflowFramework.Samples.WebApi/packages.lock.json +++ b/samples/WorkflowFramework.Samples.WebApi/packages.lock.json @@ -17,23 +17,65 @@ "resolved": "8.0.0", "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "xVDHL0+SIgemfh95fTO9cGLe17TWv/ZP0n7m01z8X6pzt2DmQpucioWR/mYZA1sRlkWnkXzfl0JweLNWmE9WMg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "mQiTzAj7PIJ2A9YXR5QhgulS1fTWhmQc3ckd1Mrf3hKW07d03fBDqx8vVaFw+cRTebDOeB6pNqdWdnRxsi1hBA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Options": "10.0.3" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "rwGWGY2Vg+8NWS+nOLrnf47K4EM1IsTffb2oOLrUyxlsq7WbVTTwTn5BUiViMZI+lLzSGVB5ItBo6hcB65uVaA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "4TD9AXDRsipTmaemwnjt/DM5Ri0de2JzHQhvZ4woBTjUtL4XrPNsMrOk5oiLJAx1gTrE6pOIhxv+lEde5F6CZA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "GEcpTwo7sUoLGGNTqV1FZEuL+tTD9m81NX/mh099dqGNna07/UGZShKQNZRw4hv6nlliSUwYQgSYc7OR99Jufg==" + }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "workflowframework": { - "type": "Project" + "type": "Project", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "Microsoft.Extensions.Hosting.Abstractions": "[10.0.3, )" + } }, "workflowframework.extensions.dependencyinjection": { "type": "Project", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, "workflowframework.extensions.hosting": { "type": "Project", "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "[10.0.3, )", + "Microsoft.Extensions.Hosting.Abstractions": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.DependencyInjection": "[1.0.0, )", "WorkflowFramework.Extensions.Scheduling": "[1.0.0, )" @@ -44,6 +86,56 @@ "dependencies": { "WorkflowFramework": "[1.0.0, )" } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "ehHItAEsfgyEaomzj+GG7wBModWKkpho7v08i1Y6FfkBA0T9qsBbcqn2PpMpYnZag+SxjIbqfeQIrLT01jGAWg==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3", + "Microsoft.Extensions.Options": "10.0.3" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "GdMpC10Jf6poxSvUJ4lgYpJ5F/kJeaAoJmrPufjBoPYyCTKKY5Dyl0rZA+LBNvFqTq1cZa/lhlptlUhNvU6xrg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.3", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "hU6WzGTPvPoLA2ng1ILvWQb3g0qORdlHNsxI8IcPLumJb3suimYUl+bbDzdo1V4KFsvVhnMWzysHpKbZaoDQPQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Primitives": "10.0.3" + } } } } diff --git a/samples/WorkflowFramework.Samples/packages.lock.json b/samples/WorkflowFramework.Samples/packages.lock.json index 3706624..1a1e147 100644 --- a/samples/WorkflowFramework.Samples/packages.lock.json +++ b/samples/WorkflowFramework.Samples/packages.lock.json @@ -63,6 +63,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -103,6 +104,12 @@ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", "Microsoft.Extensions.Primitives": "10.0.3" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" } } } diff --git a/src/WorkflowFramework.Dashboard.Api/packages.lock.json b/src/WorkflowFramework.Dashboard.Api/packages.lock.json index f7579eb..182c20e 100644 --- a/src/WorkflowFramework.Dashboard.Api/packages.lock.json +++ b/src/WorkflowFramework.Dashboard.Api/packages.lock.json @@ -80,8 +80,12 @@ "dependencies": { "Microsoft.Data.Sqlite.Core": "9.0.6", "Microsoft.EntityFrameworkCore.Relational": "9.0.6", + "Microsoft.Extensions.Caching.Memory": "9.0.6", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.6", "Microsoft.Extensions.DependencyModel": "9.0.6", - "SQLitePCLRaw.core": "2.1.10" + "Microsoft.Extensions.Logging": "9.0.6", + "SQLitePCLRaw.core": "2.1.10", + "System.Text.Json": "9.0.6" } }, "Microsoft.Extensions.AI": { @@ -90,6 +94,9 @@ "contentHash": "hKLdKfwzwQ30Z5hA1DwHFvJJtRuyPmf41Es6t8DXW4PE/6caWK4qSDRY3i+QYmYbIVXnPlVR5xXQjYNz07giNg==", "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.2.0", + "Microsoft.Extensions.Caching.Abstractions": "10.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2", + "Microsoft.Extensions.Logging.Abstractions": "10.0.2", "System.Numerics.Tensors": "10.0.2" } }, @@ -105,33 +112,139 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", "resolved": "9.5.0", - "contentHash": "GHgq9tfncuDSaPtwd1od9It3omPuq5PmHDkTWC91VRy75SWvvT7AX+zyDEurp1+oYgLEObQ6PICv+hZvht8dig==" + "contentHash": "GHgq9tfncuDSaPtwd1od9It3omPuq5PmHDkTWC91VRy75SWvvT7AX+zyDEurp1+oYgLEObQ6PICv+hZvht8dig==", + "dependencies": { + "Microsoft.Extensions.Configuration": "9.0.5", + "Microsoft.Extensions.Hosting.Abstractions": "9.0.5", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "10.0.2", + "contentHash": "WIRPDa/qoKHmJhTAPCO/zLu9kRLQ2Fd6HD5tzgdXJ3xGEVXDHP6FvakKJjynwKrVDld8H4G4tcbW53wuC/wxMQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.2" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.6", + "contentHash": "qPW2d798tBPZcRmrlaBJqyChf2+0odDdE+0Lxvrr0ywkSNl1oNMK8AKrOfDwyXyjuLCv0ua7p6nrUExCeXhCcg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.6", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.6", + "Microsoft.Extensions.Logging.Abstractions": "9.0.6", + "Microsoft.Extensions.Options": "9.0.6", + "Microsoft.Extensions.Primitives": "9.0.6" + } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", "resolved": "9.5.0", - "contentHash": "jK7bWPhu60GvcVSqMXOdV6ZLOP5rnwvmlqSD2E5fTkAXwoGYUV/5U3tQbvlZtOpeXTu509eg2VEb+l66d7dtSg==" + "contentHash": "jK7bWPhu60GvcVSqMXOdV6ZLOP5rnwvmlqSD2E5fTkAXwoGYUV/5U3tQbvlZtOpeXTu509eg2VEb+l66d7dtSg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "Microsoft.Extensions.ObjectPool": "9.0.5" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "uYXLg2Gt8KUH5nT3u+TBpg9VrRcN5+2zPmIjqEHR4kOoBwsbtMDncEJw9HiLvZqGgIo2TR4oraibAoy5hXn2bQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", + "Microsoft.Extensions.Primitives": "9.0.5" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "xVDHL0+SIgemfh95fTO9cGLe17TWv/ZP0n7m01z8X6pzt2DmQpucioWR/mYZA1sRlkWnkXzfl0JweLNWmE9WMg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "7pQ4Tkyofm8DFWFhqn9ZmG8qSAC2VitWleATj5qob9V9KtoxCVdwRtmiVl/ha3WAgjkEfW++JLWXox9MJwMgkg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" + } }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", "resolved": "9.5.0", - "contentHash": "JT0VpQl0yrkqdQB8IrN3IqI5frfH8BzuHSsHbNU0Y1qbG/F+gF6A7rBAZTR4NfxQHTwTrO7tnrrVixEmBQ/PyQ==" + "contentHash": "JT0VpQl0yrkqdQB8IrN3IqI5frfH8BzuHSsHbNU0Y1qbG/F+gF6A7rBAZTR4NfxQHTwTrO7tnrrVixEmBQ/PyQ==", + "dependencies": { + "Microsoft.Extensions.Hosting.Abstractions": "9.0.5" + } }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", "resolved": "9.0.6", "contentHash": "grVU1ixgMHp+kuhIgvEzhE73jXRY6XmxNBPWrotmbjB9AvJvkwHnIzm1JlOsPpyixFgnzreh/bFBMJAjveX+fQ==" }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "fRiUjmhm9e4vMp6WEO9MgWNxVtWSr4Pcgh1W4DyJIr8bRANlZz9JU7uicf7ShzMspDxo/9Ejo9zJ6qQZY0IhVw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "9.0.5", + "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "mQiTzAj7PIJ2A9YXR5QhgulS1fTWhmQc3ckd1Mrf3hKW07d03fBDqx8vVaFw+cRTebDOeB6pNqdWdnRxsi1hBA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Options": "10.0.3" + } + }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", "resolved": "9.5.0", - "contentHash": "QKLs7fG05WqLyp5zOGENZ18XZzVJ2TCw7WTnsQcDwQqA34YOev2vBmIk4FwtPqPieGdqQhzcN032nZkKacIrdQ==" + "contentHash": "QKLs7fG05WqLyp5zOGENZ18XZzVJ2TCw7WTnsQcDwQqA34YOev2vBmIk4FwtPqPieGdqQhzcN032nZkKacIrdQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" + } + }, + "Microsoft.Extensions.Features": { + "type": "Transitive", + "resolved": "8.0.15", + "contentHash": "QUBxyUDGAyHppX5lDgE5XogfQ9fFtm3o4Un8cb46OMinto5hgYfKj3zZTR68QHAqKIM1iOoO6qrh1UbHUZkDQw==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "4TD9AXDRsipTmaemwnjt/DM5Ri0de2JzHQhvZ4woBTjUtL4XrPNsMrOk5oiLJAx1gTrE6pOIhxv+lEde5F6CZA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "6vbo3XjyEc+w/kv/Dkfv9NA7iSdIdX5dlU9Shk3wJJ0fiZpCVzVW5FJtNoIePX5hS0ENNpHPClq/qtq06yM4FQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "Microsoft.Extensions.Diagnostics": "9.0.5", + "Microsoft.Extensions.Logging": "9.0.5", + "Microsoft.Extensions.Logging.Abstractions": "9.0.5", + "Microsoft.Extensions.Options": "9.0.5" + } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", @@ -139,15 +252,67 @@ "contentHash": "K5VI2QA3Y2s675IyyhA34xKkUK0XZKgXU0ddXOkuCuHiEWLKs/McNVGP1Qw5B5UEGxrei7aj20Ssm+9JJ6yTlg==", "dependencies": { "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.5.0", - "Microsoft.Extensions.Telemetry": "9.5.0" + "Microsoft.Extensions.Http": "9.0.5", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5", + "Microsoft.Extensions.Telemetry": "9.5.0", + "System.IO.Pipelines": "9.0.5" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "9.0.6", + "contentHash": "XBzjitTFaQhF8EbJ645vblZezV1p52ePTxKHoVkRidHF11Xkjxg94qr0Rvp2qyxK2vBJ4OIZ41NB15YUyxTGMQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "9.0.6", + "Microsoft.Extensions.Logging.Abstractions": "9.0.6", + "Microsoft.Extensions.Options": "9.0.6" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "WgYTJ1/dxdzqaYYMrgC6cZXJVmaoxUmWgsvR9Kg5ZARpy0LMw7fZIZMIiVuaxhItwwFIW0ruhAN+Er2/oVZgmQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "9.0.5", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", + "Microsoft.Extensions.Configuration.Binder": "9.0.5", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "Microsoft.Extensions.Logging": "9.0.5", + "Microsoft.Extensions.Logging.Abstractions": "9.0.5", + "Microsoft.Extensions.Options": "9.0.5", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + } + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "C0VDKwSwNfc3YCLuno6Dip0un9LFmvuSvhpCC4ckpz6nrOmiM5JSJspQiY1dGCDRXJKFeZxa2hDpCLRL8WiBhw==" + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "CJbAVdovKPFh2FoKxesu20odRVSbL/vtvzzObnG+5u38sOfzRS2Ncy25id0TjYUGQzMhNnJUHgTUzTMDl/3c9g==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", + "Microsoft.Extensions.Configuration.Binder": "9.0.5", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "Microsoft.Extensions.Options": "9.0.5", + "Microsoft.Extensions.Primitives": "9.0.5" } }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "GEcpTwo7sUoLGGNTqV1FZEuL+tTD9m81NX/mh099dqGNna07/UGZShKQNZRw4hv6nlliSUwYQgSYc7OR99Jufg==" + }, "Microsoft.Extensions.Resilience": { "type": "Transitive", "resolved": "9.5.0", "contentHash": "KoL2rlNW/l+CWfiIFb8ZjBaqgY5DSnla5ZIxBvt5BdkGZ+xoe7ZMEw62FeQ+yot053VEPbPpZ/iTnX3zZ6kB3Q==", "dependencies": { + "Microsoft.Extensions.Diagnostics": "9.0.5", "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "9.5.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5", "Microsoft.Extensions.Telemetry.Abstractions": "9.5.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" @@ -156,7 +321,16 @@ "Microsoft.Extensions.ServiceDiscovery.Abstractions": { "type": "Transitive", "resolved": "9.2.1", - "contentHash": "Y6YmAkiJ9iPCmja2JCXe+jYanoHdaThX/uLfvQnUOW2rdbCRRUDh0BW96C//L7wSDDu2Jo4IMmbLJMRAblZpUg==" + "contentHash": "Y6YmAkiJ9iPCmja2JCXe+jYanoHdaThX/uLfvQnUOW2rdbCRRUDh0BW96C//L7wSDDu2Jo4IMmbLJMRAblZpUg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Features": "8.0.15", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0" + } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", @@ -165,6 +339,8 @@ "dependencies": { "Microsoft.Extensions.AmbientMetadata.Application": "9.5.0", "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.5.0", + "Microsoft.Extensions.Logging.Configuration": "9.0.5", + "Microsoft.Extensions.ObjectPool": "9.0.5", "Microsoft.Extensions.Telemetry.Abstractions": "9.5.0" } }, @@ -173,7 +349,10 @@ "resolved": "9.5.0", "contentHash": "vYQAUcMkW06G973ocSzJT5WFWSN7J5l3yZTQF99nUhWP/pJ1SjYBxXXCk/7jqYnBjFJgsmdrP+JxqJio/EvyQQ==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "9.5.0" + "Microsoft.Extensions.Compliance.Abstractions": "9.5.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.5", + "Microsoft.Extensions.ObjectPool": "9.0.5", + "Microsoft.Extensions.Options": "9.0.5" } }, "Microsoft.Extensions.VectorData.Abstractions": { @@ -265,6 +444,7 @@ "resolved": "1.71.0", "contentHash": "z3yTf23PhJhEASnT57JQMt7AM+DpnSST4i+2Q59uk2CVZAFotiLJtI2MHyo3P+MegNy++Zf5gmBi31Ymq6pI/Q==", "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.2", "Microsoft.SemanticKernel.Abstractions": "1.71.0", "System.Numerics.Tensors": "10.0.2" } @@ -279,7 +459,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "OpenTelemetry": { @@ -287,19 +468,25 @@ "resolved": "1.12.0", "contentHash": "aIEu2O3xFOdwIVH0AJsIHPIMH1YuX18nzu7BHyaDNQ6NWSk4Zyrs9Pp6y8SATuSbvdtmvue4mj/QZ3838srbwA==", "dependencies": { + "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.0", + "Microsoft.Extensions.Logging.Configuration": "9.0.0", "OpenTelemetry.Api.ProviderBuilderExtensions": "1.12.0" } }, "OpenTelemetry.Api": { "type": "Transitive", "resolved": "1.12.0", - "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==" + "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "9.0.0" + } }, "OpenTelemetry.Api.ProviderBuilderExtensions": { "type": "Transitive", "resolved": "1.12.0", "contentHash": "t6Vk1143BfiisCWYbRcyzkAuN6Aq5RkYtfOSMoqCIRMvtN9p1e1xzc0nWQ+fccNGOVgHn3aMK5xFn2+iWMcr8A==", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "OpenTelemetry.Api": "1.12.0" } }, @@ -308,6 +495,8 @@ "resolved": "8.4.2", "contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==", "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", "Polly.Core": "8.4.2" } }, @@ -316,7 +505,8 @@ "resolved": "8.4.2", "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==", "dependencies": { - "Polly.Core": "8.4.2" + "Polly.Core": "8.4.2", + "System.Threading.RateLimiting": "8.0.0" } }, "SQLitePCLRaw.bundle_e_sqlite3": { @@ -331,7 +521,10 @@ "SQLitePCLRaw.core": { "type": "Transitive", "resolved": "2.1.10", - "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", + "dependencies": { + "System.Memory": "4.5.3" + } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", @@ -351,6 +544,7 @@ "resolved": "1.8.1", "contentHash": "4oUQgw/vaO4FBOk3YsH40hbrjxRED1l95rRLvTMtHXfQxapXya9IfPpm/KgwValFFtYTfYGFOs/qzGmGyexicQ==", "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", "System.Memory.Data": "8.0.1" } }, @@ -363,18 +557,42 @@ "Microsoft.IdentityModel.Tokens": "8.0.1" } }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, "System.Memory.Data": { "type": "Transitive", "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", "contentHash": "EzimXy5WX7RJxf1pHBfolBApA4GR7qje1cY9XofD4C+cQepx0a5ZVlZjde8NHk+W1+6kltrbbfa8LIOVpTM6yQ==" }, + "System.Threading.RateLimiting": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q==" + }, "workflowframework": { - "type": "Project" + "type": "Project", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "Microsoft.Extensions.Hosting.Abstractions": "[10.0.3, )" + } }, "workflowframework.dashboard.persistence": { "type": "Project", @@ -398,6 +616,8 @@ "workflowframework.extensions.agents": { "type": "Project", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -434,7 +654,9 @@ "contentHash": "r5hzM6Bhw4X3z28l5vmsaCPjk9VsQP4zaaY01THh1SAYjgTMVadYIvpNkCfmrv/Klks6aIf2A9eY7cpGZab/hg==", "dependencies": { "Microsoft.EntityFrameworkCore.Abstractions": "9.0.6", - "Microsoft.EntityFrameworkCore.Analyzers": "9.0.6" + "Microsoft.EntityFrameworkCore.Analyzers": "9.0.6", + "Microsoft.Extensions.Caching.Memory": "9.0.6", + "Microsoft.Extensions.Logging": "9.0.6" } }, "Microsoft.EntityFrameworkCore.Relational": { @@ -443,7 +665,10 @@ "resolved": "9.0.6", "contentHash": "Ht6OT17sYnO31Dx+hX72YHrc5kZt53g5napaw0FpyIekXCvb+gUVvufEG55Fa7taFm8ccy0Vzs+JVNR9NL0JlA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "9.0.6" + "Microsoft.EntityFrameworkCore": "9.0.6", + "Microsoft.Extensions.Caching.Memory": "9.0.6", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.6", + "Microsoft.Extensions.Logging": "9.0.6" } }, "Microsoft.EntityFrameworkCore.Sqlite": { @@ -453,9 +678,41 @@ "contentHash": "bVSdfFrqIo3ZeQfWYYfnVVanP1GWghkdw+MnEmZJz7jUwtdPQpBKHr0BW9dMizPamzU+SMA1Qu4nXuRTlKVAGQ==", "dependencies": { "Microsoft.EntityFrameworkCore.Sqlite.Core": "9.0.6", + "Microsoft.Extensions.Caching.Memory": "9.0.6", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.6", "Microsoft.Extensions.DependencyModel": "9.0.6", + "Microsoft.Extensions.Logging": "9.0.6", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10", - "SQLitePCLRaw.core": "2.1.10" + "SQLitePCLRaw.core": "2.1.10", + "System.Text.Json": "9.0.6" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.2", + "contentHash": "J/Zmp6fY93JbaiZ11ckWvcyxMPjD6XVwIHQXBjryTBgn7O6O20HYg9uVLFcZlNfgH78MnreE/7EH+hjfzn7VyA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "GdMpC10Jf6poxSvUJ4lgYpJ5F/kJeaAoJmrPufjBoPYyCTKKY5Dyl0rZA+LBNvFqTq1cZa/lhlptlUhNvU6xrg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.3", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3" } }, "Microsoft.Extensions.Http.Resilience": { @@ -464,16 +721,45 @@ "resolved": "9.5.0", "contentHash": "6+D5dTm6t+Rg93ODzQ/obWuUxl+YPEm6bU4lz6dA2lxPjJmqbsUKP3l2bXlMcahj3EFj9n4gpRD7fzF46q+ecQ==", "dependencies": { + "Microsoft.Extensions.Configuration.Binder": "9.0.5", "Microsoft.Extensions.Http.Diagnostics": "9.5.0", + "Microsoft.Extensions.ObjectPool": "9.0.5", "Microsoft.Extensions.Resilience": "9.5.0" } }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "hU6WzGTPvPoLA2ng1ILvWQb3g0qORdlHNsxI8IcPLumJb3suimYUl+bbDzdo1V4KFsvVhnMWzysHpKbZaoDQPQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, "Microsoft.Extensions.ServiceDiscovery": { "type": "CentralTransitive", "requested": "[9.2.1, )", "resolved": "9.2.1", "contentHash": "7hX4v/B4/i7HiBSrfNn2OWq6IKv8Z4ip8+RlVddfxilFKgOt3ci3e8umHiGukZ5svebqDUxuIHrgv9jNivviFQ==", "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Features": "8.0.15", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", "Microsoft.Extensions.ServiceDiscovery.Abstractions": "9.2.1" } }, @@ -502,6 +788,7 @@ "resolved": "1.12.0", "contentHash": "6/8O6rsJRwslg5/Fm3bscBelw4Yh9T9CN24p7cAsuEFkrmmeSO9gkYUCK02Qi+CmPM2KHYTLjKi0lJaCsDMWQA==", "dependencies": { + "Microsoft.Extensions.Hosting.Abstractions": "9.0.0", "OpenTelemetry": "1.12.0" } }, @@ -520,6 +807,8 @@ "resolved": "1.12.0", "contentHash": "0rW+MbHgUQAdbvBtRxPYoQBosbNdWegL7cYkRlxq+KQ/VFyU8itt4pWTccmu1/FWmTgqJyT3LaujyDZoRrm8Yg==", "dependencies": { + "Microsoft.Extensions.Configuration": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0", "OpenTelemetry.Api.ProviderBuilderExtensions": "[1.12.0, 2.0.0)" } }, @@ -537,6 +826,18 @@ "requested": "[8.6.0, )", "resolved": "8.4.2", "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.0", + "contentHash": "1Dpjwq9peG/Wt5BNbrzIhTpclfOSqBWZsUO28vVr59yQlkvL5jLBWfpfzRmJ1OY+6DciaY0DUcltyzs4fuZHjw==" } } } diff --git a/src/WorkflowFramework.Dashboard.AppHost/WorkflowFramework.Dashboard.AppHost.csproj b/src/WorkflowFramework.Dashboard.AppHost/WorkflowFramework.Dashboard.AppHost.csproj index f1edc71..acb155b 100644 --- a/src/WorkflowFramework.Dashboard.AppHost/WorkflowFramework.Dashboard.AppHost.csproj +++ b/src/WorkflowFramework.Dashboard.AppHost/WorkflowFramework.Dashboard.AppHost.csproj @@ -9,6 +9,10 @@ true false false false + + false diff --git a/src/WorkflowFramework.Dashboard.AppHost/packages.lock.json b/src/WorkflowFramework.Dashboard.AppHost/packages.lock.json deleted file mode 100644 index 1bad767..0000000 --- a/src/WorkflowFramework.Dashboard.AppHost/packages.lock.json +++ /dev/null @@ -1,671 +0,0 @@ -{ - "version": 2, - "dependencies": { - "net10.0": { - "Aspire.Dashboard.Sdk.win-x64": { - "type": "Direct", - "requested": "[9.2.1, )", - "resolved": "9.2.1", - "contentHash": "Ps8SfLO0BfNfKhthJ8o+3Rd6ritF2eCafCcWW9vfdT9wcMvn9pujPWPMJo6XVjk1C3zHrPyva9UMTbOT48HKTg==" - }, - "Aspire.Hosting.AppHost": { - "type": "Direct", - "requested": "[9.2.1, )", - "resolved": "9.2.1", - "contentHash": "fnJKXvMD82ma7nEug+b9BZq0zUcyD+TJZei+f7BWkfRrTKznch56P2hNWmQHCRG0ZicTB6SbKuRtVa3i7uFf1Q==", - "dependencies": { - "AspNetCore.HealthChecks.Uris": "9.0.0", - "Aspire.Hosting": "9.2.1", - "Google.Protobuf": "3.30.1", - "Grpc.AspNetCore": "2.70.0", - "Grpc.Net.ClientFactory": "2.70.0", - "Grpc.Tools": "2.71.0", - "Humanizer.Core": "2.14.1", - "JsonPatch.Net": "3.3.0", - "KubernetesClient": "16.0.2", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Diagnostics.HealthChecks": "9.0.4", - "Microsoft.Extensions.Hosting": "9.0.4", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.4", - "Microsoft.Extensions.Http": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4", - "Newtonsoft.Json": "13.0.3", - "Polly.Core": "8.5.2", - "StreamJsonRpc": "2.21.69", - "System.IO.Hashing": "9.0.3" - } - }, - "Aspire.Hosting.Orchestration.win-x64": { - "type": "Direct", - "requested": "[9.2.1, )", - "resolved": "9.2.1", - "contentHash": "zql5k3nKMwCBfpODLt/sy/nKsZM272+LV67e3ehv9Ec2+0mUuPRs2DGx9mzvh7sBYBq53pF7A7pn9E3V6FkOXw==" - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "Aspire.Hosting": { - "type": "Transitive", - "resolved": "9.2.1", - "contentHash": "Awidk6C7nris+LT3Yq48oihv5uVbGmP/4rpO1sLxvxwuxSXEnPkrB2MTGCCqr3Z/e68u9J54s6p8RBdIYwTe0w==", - "dependencies": { - "AspNetCore.HealthChecks.Uris": "9.0.0", - "Google.Protobuf": "3.30.1", - "Grpc.AspNetCore": "2.70.0", - "Grpc.Net.ClientFactory": "2.70.0", - "Grpc.Tools": "2.71.0", - "Humanizer.Core": "2.14.1", - "JsonPatch.Net": "3.3.0", - "KubernetesClient": "16.0.2", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.2", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", - "Microsoft.Extensions.Hosting": "8.0.1", - "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", - "Microsoft.Extensions.Http": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2", - "Microsoft.Extensions.Primitives": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "Polly.Core": "8.5.2", - "StreamJsonRpc": "2.21.69", - "System.IO.Hashing": "9.0.3" - } - }, - "AspNetCore.HealthChecks.Uris": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "XYdNlA437KeF8p9qOpZFyNqAN+c0FXt/JjTvzH/Qans0q0O3pPE8KPnn39ucQQjR/Roum1vLTP3kXiUs8VHyuA==", - "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", - "Microsoft.Extensions.Http": "8.0.0" - } - }, - "Fractions": { - "type": "Transitive", - "resolved": "7.3.0", - "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" - }, - "Google.Protobuf": { - "type": "Transitive", - "resolved": "3.30.1", - "contentHash": "HeWXDQBabQn/sCGicbeLJ0HMunknfC4FdLrOQOsaMJHcpqx3HVIpyyJqTrqJlWnza870twhOb+rBcaTiC/TlNA==" - }, - "Grpc.AspNetCore": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "s29ST5F2/PZLzOnfqfeDn0emAZajBtYnV9G7hkbK8Eu9+XphoL3KfiEsg2eBsx7P9YYQXcksDbE+CbHApMZeJA==", - "dependencies": { - "Google.Protobuf": "3.27.0", - "Grpc.AspNetCore.Server.ClientFactory": "2.70.0", - "Grpc.Tools": "2.70.0" - } - }, - "Grpc.AspNetCore.Server": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "9d6JuMLSxwOX4zERV7HBwq1XL8DD48a6FSoxD5dDXrCz/o0HqMXE2+lRcXHckOlz1JCesznW8XMMJdsU1FfY7w==", - "dependencies": { - "Grpc.Net.Common": "2.70.0" - } - }, - "Grpc.AspNetCore.Server.ClientFactory": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "k4GrvUAgVWm7DyhnV55MHdX4bQSpZVEQmlZO3bdSmGZ+z6Hx+CwDlhqiReczCm6qbzSUbS1YW0t7z7UEObTwKA==", - "dependencies": { - "Grpc.AspNetCore.Server": "2.70.0", - "Grpc.Net.ClientFactory": "2.70.0" - } - }, - "Grpc.Core.Api": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "66UotvWcSIq41oiQhLWcQACyKPM4umxXNiht5DQTLZJfNwEswWOcS7Z0xIEHyNIBE7ZpjotH22bEjTkvhPxmVw==" - }, - "Grpc.Net.Client": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "xNv0FFCVJa5S1beUtye82WFCxKThuE1jbN8DO1x1Rj8VSIWXLBUmfSID5a1fGzsU2R/EMfwPoWclJ2RMfQuGXw==", - "dependencies": { - "Grpc.Net.Common": "2.70.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Grpc.Net.ClientFactory": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "Qg+93oj/8RdEw3PnLZNNYWnWCWyJYC/ZYZcjeln/pLaxLaPvdXES1peiqSJUI4wLFZ1JwGlbWt8+nM1i2E7ihg==", - "dependencies": { - "Grpc.Net.Client": "2.70.0", - "Microsoft.Extensions.Http": "6.0.0" - } - }, - "Grpc.Net.Common": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "rBdEUMyCwa+iB8mqC6JKyPbj3SBHHkReJj/yy/XKJI63GcG6w9DJMMGTVcYHqq4Ci2W4m0HT4jt2pFfFscar8g==", - "dependencies": { - "Grpc.Core.Api": "2.70.0" - } - }, - "Grpc.Tools": { - "type": "Transitive", - "resolved": "2.71.0", - "contentHash": "r8zHZm7kHdMrtujnkcuQ0BNDH2969at/8Va1ZzQgVblaQzR7tm8JlA3G+5Z5IFbvvf9PcAr1/VcoSR+g7j4Nyw==" - }, - "Humanizer.Core": { - "type": "Transitive", - "resolved": "2.14.1", - "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" - }, - "IdentityModel": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "to99aLL5Gev1GOb2gUao/UZXT/uXMyjEmHPNrf/vJI2HBD1LMCTeC4SBCe/cqMIB12V9v+eSieq7ff0lju9pOQ==" - }, - "IdentityModel.OidcClient": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "m2PZbjeG3nXIQ72NLZvFz3FLFk7GmqLnxO/ifUvaTEE3BDZXp7DXAdjDP6TQKaL20+wDnej2ffA1Yh3vVcJOkA==", - "dependencies": { - "IdentityModel": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0" - } - }, - "Json.More.Net": { - "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "qtwsyAsL55y2vB2/sK4Pjg3ZyVzD5KKSpV3lOAMHlnjFfsjQ/86eHJfQT9aV1YysVXzF4+xyHOZbh7Iu3YQ7Lg==" - }, - "JsonPatch.Net": { - "type": "Transitive", - "resolved": "3.3.0", - "contentHash": "GIcMMDtzfzVfIpQgey8w7dhzcw6jG5nD4DDAdQCTmHfblkCvN7mI8K03to8YyUhKMl4PTR6D6nLSvWmyOGFNTg==", - "dependencies": { - "JsonPointer.Net": "5.2.0" - } - }, - "JsonPointer.Net": { - "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "qe1F7Tr/p4mgwLPU9P60MbYkp+xnL2uCPnWXGgzfR/AZCunAZIC0RZ32dLGJJEhSuLEfm0YF/1R3u5C7mEVq+w==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Json.More.Net": "2.1.0" - } - }, - "KubernetesClient": { - "type": "Transitive", - "resolved": "16.0.2", - "contentHash": "MTec7O7S23OtffS7lGnt75Q3h2/Jdl+y54uoJyP6MeGnvzeuAGq5n8QSaqUkLvDILvD92FS5kcEqpiCr79UnWQ==", - "dependencies": { - "Fractions": "7.3.0", - "IdentityModel.OidcClient": "6.0.0", - "System.IdentityModel.Tokens.Jwt": "8.3.0", - "YamlDotNet": "16.3.0" - } - }, - "MessagePack": { - "type": "Transitive", - "resolved": "2.5.192", - "contentHash": "Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==", - "dependencies": { - "MessagePack.Annotations": "2.5.192", - "Microsoft.NET.StringTools": "17.6.3" - } - }, - "MessagePack.Annotations": { - "type": "Transitive", - "resolved": "2.5.192", - "contentHash": "jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "KIVBrMbItnCJDd1RF4KEaE8jZwDJcDUJW5zXpbwQ05HNYTK1GveHxHK0B3SjgDJuR48GRACXAO+BLhL8h34S7g==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "0LN/DiIKvBrkqp7gkF3qhGIeZk6/B63PthAHjQsxymJfIBcz0kbf4/p/t4lMgggVxZ+flRi5xvTwlpPOoZk8fg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "cdrjcl9RIcwt3ECbnpP0Gt1+pkjdW90mq5yFYy8D9qRj2NqFFcv3yDp141iEamsd9E218sGxK8WHaIOcrqgDJg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "TbM2HElARG7z1gxwakdppmOkm1SykPqDcu3EF97daEwSb/+TXnRrFfJtF+5FWWxcsNhbRrmLfS2WszYcab7u1A==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "2IGiG3FtVnD83IA6HYGuNei8dOw455C09yEhGl8bjcY6aGZgoC6yhYvDnozw8wlTowfoG9bxVrdTsr2ACZOYHg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "UY864WQ3AS2Fkc8fYLombWnjrXwYt+BEHHps0hY4sxlgqaVW06AxbpgRZjfYf8PyRbplJqruzZDB/nSLT+7RLQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Physical": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "vVXI70CgT/dmXV3MM+n/BR2rLXEoAyoK0hQT+8MrbCMuJBiLRxnTtSrksNiASWCwOtxo/Tyy7CO8AGthbsYxnw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "zuvyC72gJkJyodyGowCuz3EQ1QvzNXJtKusuRzmjoHr17aeB3X0aSiKFB++HMHnQIWWlPOBf9YHTQfEqzbgl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Json": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Physical": "9.0.4" - } - }, - "Microsoft.Extensions.Diagnostics": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "1bCSQrGv9+bpF5MGKF6THbnRFUZqQDrWPA39NDeVW9djeHBmow8kX4SX6/8KkeKI8gmUDG7jsG/bVuNAcY/ATQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.4", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.4" - } - }, - "Microsoft.Extensions.Diagnostics.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "IAucBcHYtiCmMyFag+Vrp5m+cjGRlDttJk9Vx7Dqpq+Ama4BzVUOk0JARQakgFFr7ZTBSgLKlHmtY5MiItB7Cg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "XM6WwNbDkVuGhDN89eKxA2Og2eMDXB0PVI7PEzl2R0MbFjYUlfTh7D7vBPEWUVCf2zPDAFiwcMlnVzi6Umq5mg==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "gQN2o/KnBfVk6Bd71E2YsvO5lsqrqHmaepDGk+FB/C4aiQY9B0XKKNKfl5/TqcNOs9OEithm4opiMHAErMFyEw==", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "qkQ9V7KFZdTWNThT7ke7E/Jad38s46atSs3QUYZB8f3thBTrcrousdY4Y/tyCtcH5YjsPSiByjuN+L8W/ThMQg==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileSystemGlobbing": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "05Lh2ItSk4mzTdDWATW9nEcSybwprN8Tz42Fs5B+jwdXUpauktdAQUI1Am4sUQi2C63E5hvQp8gXvfwfg9mQGQ==" - }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "1rZwLE+tTUIyZRUzmlk/DQj+v+Eqox+rjb+X7Fi+cYTbQfIZPYwpf1pVybsV3oje8+Pe4GaNukpBVUlPYeQdeQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.Configuration.CommandLine": "9.0.4", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.4", - "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4", - "Microsoft.Extensions.Configuration.Json": "9.0.4", - "Microsoft.Extensions.Configuration.UserSecrets": "9.0.4", - "Microsoft.Extensions.DependencyInjection": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Diagnostics": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Physical": "9.0.4", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Configuration": "9.0.4", - "Microsoft.Extensions.Logging.Console": "9.0.4", - "Microsoft.Extensions.Logging.Debug": "9.0.4", - "Microsoft.Extensions.Logging.EventLog": "9.0.4", - "Microsoft.Extensions.Logging.EventSource": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "ezelU6HJgmq4862YoWuEbHGSV+JnfnonTSbNSJVh6n6wDehyiJn4hBtcK7rGbf2KO3QeSvK5y8E7uzn1oaRH5w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Diagnostics": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "xW6QPYsqhbuWBO9/1oA43g/XPKbohJx+7G8FLQgQXIriYvY7s+gxr2wjQJfRoPO900dvvv2vVH7wZovG+M1m6w==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "/kF+rSnoo3/nIwGzWsR4RgBnoTOdZ3lzz2qFRyp/GgaNid4j6hOAQrs/O+QHXhlcAdZxjg37MvtIE+pAvIgi9g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "cI0lQe0js65INCTCtAgnlVJWKgzgoRHVAW1B1zwCbmcliO4IZoTf92f1SYbLeLk7FzMJ/GlCvjLvJegJ6kltmQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Configuration": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "D1jy+jy+huUUxnkZ0H480RZK8vqKn8NsQxYpMpPL/ALPPh1WATVLcr/uXI3RUBB45wMW5265O+hk9x3jnnXFuA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "bApxdklf7QTsONOLR5ow6SdDFXR5ncHvumSEg2+QnCvxvkzc2z5kNn7yQCyupRLRN4jKbnlTkVX8x9qLlwL6Qg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "System.Diagnostics.EventLog": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "R600zTxVJNw2IeAEOvdOJGNA1lHr1m3vo460hSF5G1DjwP0FNpyeH4lpLDMuf34diKwB1LTt5hBw1iF1/iuwsQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "aridVhAT3Ep+vsirR1pzjaOw0Jwiob6dc73VFQn2XmDfBA2X98M8YKO1GarvsXRX7gX1Aj+hj2ijMzrMHDOm0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" - }, - "Microsoft.IdentityModel.Abstractions": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "jNin7yvWZu+K3U24q+6kD+LmGSRfbkHl9Px8hN1XrGwq6ZHgKGi/zuTm5m08G27fwqKfVXIWuIcUeq4Y1VQUOg==" - }, - "Microsoft.IdentityModel.JsonWebTokens": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "4SVXLT8sDG7CrHiszEBrsDYi+aDW0W9d+fuWUGdZPBdan56aM6fGXJDjbI0TVGEDjJhXbACQd8F/BnC7a+m2RQ==", - "dependencies": { - "Microsoft.IdentityModel.Tokens": "8.3.0" - } - }, - "Microsoft.IdentityModel.Logging": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "4w4pSIGHhCCLTHqtVNR2Cc/zbDIUWIBHTZCu/9ZHm2SVwrXY3RJMcZ7EFGiKqmKZMQZJzA0bpwCZ6R8Yb7i5VQ==", - "dependencies": { - "Microsoft.IdentityModel.Abstractions": "8.3.0" - } - }, - "Microsoft.IdentityModel.Tokens": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "yGzqmk+kInH50zeSEH/L1/J0G4/yqTQNq4YmdzOhpE7s/86tz37NS2YbbY2ievbyGjmeBI1mq26QH+yBR6AK3Q==", - "dependencies": { - "Microsoft.IdentityModel.Logging": "8.3.0" - } - }, - "Microsoft.NET.StringTools": { - "type": "Transitive", - "resolved": "17.6.3", - "contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.VisualStudio.Threading.Only": { - "type": "Transitive", - "resolved": "17.13.61", - "contentHash": "vl5a2URJYCO5m+aZZtNlAXAMz28e2pUotRuoHD7RnCWOCeoyd8hWp5ZBaLNYq4iEj2oeJx5ZxiSboAjVmB20Qg==", - "dependencies": { - "Microsoft.VisualStudio.Validation": "17.8.8" - } - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.8.8", - "contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g==" - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.11.90", - "contentHash": "7jrOfU6b/PVBccqzNLfw9u84WWzkSpvWLb2mZxvwdQkOx/V9FXWkmnp/rjOnBFDOhrO/ev4+gQ5QS13FkgNSBA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.VisualStudio.Threading.Only": "17.13.61", - "Microsoft.VisualStudio.Validation": "17.8.8" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "StreamJsonRpc": { - "type": "Transitive", - "resolved": "2.21.69", - "contentHash": "WbTpn/PIo+HpFYnsOCiOOe0kHUE2N1eiVRi7MO70DFBTMG3pAOfrgHtwUpOJ37dfDETq/9P9WNIbHom4ABZfrA==", - "dependencies": { - "MessagePack": "2.5.192", - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.VisualStudio.Threading.Only": "17.13.61", - "Microsoft.VisualStudio.Validation": "17.8.8", - "Nerdbank.Streams": "2.11.90", - "Newtonsoft.Json": "13.0.3" - } - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ==" - }, - "System.IdentityModel.Tokens.Jwt": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "9GESpDG0Zb17HD5mBW/uEWi2yz/uKPmCthX2UhyLnk42moGH2FpMgXA2Y4l2Qc7P75eXSUTA6wb/c9D9GSVkzw==", - "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "8.3.0", - "Microsoft.IdentityModel.Tokens": "8.3.0" - } - }, - "System.IO.Hashing": { - "type": "Transitive", - "resolved": "9.0.3", - "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.4", - "contentHash": "f2MTUaS2EQ3lX4325ytPAISZqgBfXmY0WvgD80ji6Z20AoDNiCESxsqo6mFRwHJD/jfVKRw9FsW6+86gNre3ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.4", - "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" - }, - "Microsoft.Extensions.Diagnostics.HealthChecks": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.4", - "contentHash": "jW9lhWQzOOL5sBUCNtAiS6B7tGeLlxJVDjwNuQAQl6dDt9PAAxt3+T2F2jtcvi7KoujgzAdkKQKtGoRaAGlD9w==", - "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "9.0.4", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Hosting.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.4", - "contentHash": "bXkwRPMo4x19YKH6/V9XotU7KYQJlihXhcWO1RDclAY3yfY3XNg4QtSEBvng4kK/DnboE0O/nwSl+6Jiv9P+FA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.4", - "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.4", - "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Polly.Core": { - "type": "CentralTransitive", - "requested": "[8.6.0, )", - "resolved": "8.5.2", - "contentHash": "1MJKdxv4zwDmiWvYvVN24DsrWUfgQ4F83voH8bhbtLMdPuGy8CfTUzsgQhvyrl1a7hrM6f/ydwLVdVUI0xooUw==" - }, - "YamlDotNet": { - "type": "CentralTransitive", - "requested": "[16.3.0, )", - "resolved": "16.3.0", - "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" - } - } - } -} \ No newline at end of file diff --git a/src/WorkflowFramework.Dashboard.Web/packages.lock.json b/src/WorkflowFramework.Dashboard.Web/packages.lock.json index 289ac54..4b08041 100644 --- a/src/WorkflowFramework.Dashboard.Web/packages.lock.json +++ b/src/WorkflowFramework.Dashboard.Web/packages.lock.json @@ -4,9 +4,9 @@ "net10.0": { "Microsoft.AspNetCore.App.Internal.Assets": { "type": "Direct", - "requested": "[10.0.4, )", - "resolved": "10.0.4", - "contentHash": "M942X5Vy726SlvFBuoAC4cDczEMlPAFt1mmyFlrkw/QcpdVwVU0DkF4P9JabxX6eWNm9RvaYZHe25FN7oXoxpQ==" + "requested": "[10.0.5, )", + "resolved": "10.0.5", + "contentHash": "Oxw9Ps1/nd6c/EMCAI13AeJFEqXezAvCEOshMjUWmL7LeGirHJNzytR2e/3jINYg0j2TmPvNUowGHf+gp8zDSQ==" }, "Microsoft.AspNetCore.SignalR.Client": { "type": "Direct", diff --git a/src/WorkflowFramework.Dashboard/packages.lock.json b/src/WorkflowFramework.Dashboard/packages.lock.json index 787872b..c9f9c50 100644 --- a/src/WorkflowFramework.Dashboard/packages.lock.json +++ b/src/WorkflowFramework.Dashboard/packages.lock.json @@ -4,9 +4,9 @@ "net10.0": { "Microsoft.AspNetCore.App.Internal.Assets": { "type": "Direct", - "requested": "[10.0.4, )", - "resolved": "10.0.4", - "contentHash": "M942X5Vy726SlvFBuoAC4cDczEMlPAFt1mmyFlrkw/QcpdVwVU0DkF4P9JabxX6eWNm9RvaYZHe25FN7oXoxpQ==" + "requested": "[10.0.5, )", + "resolved": "10.0.5", + "contentHash": "Oxw9Ps1/nd6c/EMCAI13AeJFEqXezAvCEOshMjUWmL7LeGirHJNzytR2e/3jINYg0j2TmPvNUowGHf+gp8zDSQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", @@ -23,19 +23,99 @@ "resolved": "8.0.0", "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "xVDHL0+SIgemfh95fTO9cGLe17TWv/ZP0n7m01z8X6pzt2DmQpucioWR/mYZA1sRlkWnkXzfl0JweLNWmE9WMg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "mQiTzAj7PIJ2A9YXR5QhgulS1fTWhmQc3ckd1Mrf3hKW07d03fBDqx8vVaFw+cRTebDOeB6pNqdWdnRxsi1hBA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Options": "10.0.3" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "4TD9AXDRsipTmaemwnjt/DM5Ri0de2JzHQhvZ4woBTjUtL4XrPNsMrOk5oiLJAx1gTrE6pOIhxv+lEde5F6CZA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "GEcpTwo7sUoLGGNTqV1FZEuL+tTD9m81NX/mh099dqGNna07/UGZShKQNZRw4hv6nlliSUwYQgSYc7OR99Jufg==" + }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "workflowframework": { - "type": "Project" + "type": "Project", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "Microsoft.Extensions.Hosting.Abstractions": "[10.0.3, )" + } }, "workflowframework.extensions.diagnostics": { "type": "Project", "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "GdMpC10Jf6poxSvUJ4lgYpJ5F/kJeaAoJmrPufjBoPYyCTKKY5Dyl0rZA+LBNvFqTq1cZa/lhlptlUhNvU6xrg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.3", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "hU6WzGTPvPoLA2ng1ILvWQb3g0qORdlHNsxI8IcPLumJb3suimYUl+bbDzdo1V4KFsvVhnMWzysHpKbZaoDQPQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" } }, "net8.0": { diff --git a/src/WorkflowFramework.Extensions.Agents.Mcp/packages.lock.json b/src/WorkflowFramework.Extensions.Agents.Mcp/packages.lock.json index fdca96e..a4d3182 100644 --- a/src/WorkflowFramework.Extensions.Agents.Mcp/packages.lock.json +++ b/src/WorkflowFramework.Extensions.Agents.Mcp/packages.lock.json @@ -332,7 +332,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -431,7 +432,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "System.ClientModel": { @@ -448,6 +450,11 @@ "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", @@ -464,6 +471,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -525,6 +533,18 @@ "Microsoft.SemanticKernel.Connectors.AzureOpenAI": "1.71.0", "Microsoft.SemanticKernel.Core": "1.71.0" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.0", + "contentHash": "1Dpjwq9peG/Wt5BNbrzIhTpclfOSqBWZsUO28vVr59yQlkvL5jLBWfpfzRmJ1OY+6DciaY0DUcltyzs4fuZHjw==" } }, "net8.0": { diff --git a/src/WorkflowFramework.Extensions.Agents.Skills/packages.lock.json b/src/WorkflowFramework.Extensions.Agents.Skills/packages.lock.json index a653baf..a7796d5 100644 --- a/src/WorkflowFramework.Extensions.Agents.Skills/packages.lock.json +++ b/src/WorkflowFramework.Extensions.Agents.Skills/packages.lock.json @@ -332,7 +332,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -431,7 +432,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "System.ClientModel": { @@ -448,6 +450,11 @@ "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", @@ -464,6 +471,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -525,6 +533,18 @@ "Microsoft.SemanticKernel.Connectors.AzureOpenAI": "1.71.0", "Microsoft.SemanticKernel.Core": "1.71.0" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.0", + "contentHash": "1Dpjwq9peG/Wt5BNbrzIhTpclfOSqBWZsUO28vVr59yQlkvL5jLBWfpfzRmJ1OY+6DciaY0DUcltyzs4fuZHjw==" } }, "net8.0": { diff --git a/src/WorkflowFramework.Extensions.Configuration/IWorkflowDefinitionLoader.cs b/src/WorkflowFramework.Extensions.Configuration/IWorkflowDefinitionLoader.cs index c5d80cd..eceba13 100644 --- a/src/WorkflowFramework.Extensions.Configuration/IWorkflowDefinitionLoader.cs +++ b/src/WorkflowFramework.Extensions.Configuration/IWorkflowDefinitionLoader.cs @@ -1,5 +1,7 @@ +using System.Reflection; using System.Text.Json; using WorkflowFramework.Builder; +using YamlDotNet.RepresentationModel; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; @@ -127,7 +129,8 @@ public sealed class YamlWorkflowDefinitionLoader : IWorkflowDefinitionLoader public WorkflowDefinition Load(string content) { if (content == null) throw new ArgumentNullException(nameof(content)); - return Deserializer.Deserialize(content) + var normalized = NormalizeThenElseLists(content); + return Deserializer.Deserialize(normalized) ?? throw new InvalidOperationException("Failed to deserialize YAML workflow definition."); } @@ -138,6 +141,65 @@ public WorkflowDefinition LoadFromFile(string filePath) var content = File.ReadAllText(filePath); return Load(content); } + + /// + /// Rewrites the YAML document so that any then: or else: key whose value is + /// a YAML sequence is renamed to thenSteps: or elseSteps: respectively. + /// This allows authors to write then: [...] / else: [...] as natural list + /// aliases rather than having to remember the longer thenSteps / elseSteps keys. + /// Scalar values (legacy single-class format) are left unchanged. + /// + private static string NormalizeThenElseLists(string yaml) + { + var stream = new YamlStream(); + using var reader = new StringReader(yaml); + stream.Load(reader); + + foreach (var document in stream.Documents) + NormalizeNode(document.RootNode); + + using var writer = new StringWriter(); + stream.Save(writer, assignAnchors: false); + return writer.ToString(); + } + + private static void NormalizeNode(YamlNode node) + { + if (node is YamlMappingNode mapping) + { + // Collect renames first to avoid mutating the dictionary while iterating. + List<(YamlScalarNode OldKey, string NewName)>? renames = null; + foreach (var child in mapping.Children) + { + if (child.Key is YamlScalarNode scalar && child.Value is YamlSequenceNode) + { + if (scalar.Value == "then") + (renames ??= []).Add((scalar, "thenSteps")); + else if (scalar.Value == "else") + (renames ??= []).Add((scalar, "elseSteps")); + } + } + + if (renames != null) + { + foreach (var (oldKey, newName) in renames) + { + var value = mapping.Children[oldKey]; + mapping.Children.Remove(oldKey); + mapping.Children.Add(new YamlScalarNode(newName), value); + } + } + + // Recurse into all child values. + foreach (var child in mapping.Children.Values) + NormalizeNode(child); + } + else if (node is YamlSequenceNode sequence) + { + foreach (var child in sequence.Children) + NormalizeNode(child); + } + } } /// @@ -145,15 +207,27 @@ public WorkflowDefinition LoadFromFile(string filePath) /// public sealed class WorkflowDefinitionBuilder { + private static readonly HashSet KnownCategories = new(StringComparer.OrdinalIgnoreCase) + { + "step", "conditional", "parallel", "foreach", "while", "dowhile", + "retry", "try", "subworkflow", "approval", "saga" + }; + + /// Cache of exception type name → to avoid repeated assembly scans. + private static readonly System.Collections.Concurrent.ConcurrentDictionary ExceptionTypeCache = new(); + private readonly IStepRegistry _stepRegistry; + private readonly IReadOnlyDictionary? _subWorkflows; /// /// Initializes a new instance of . /// - /// The step registry. - public WorkflowDefinitionBuilder(IStepRegistry stepRegistry) + /// The step registry used to resolve step class names. + /// Optional registry of named sub-workflows (used for type: subworkflow). + public WorkflowDefinitionBuilder(IStepRegistry stepRegistry, IReadOnlyDictionary? subWorkflows = null) { _stepRegistry = stepRegistry; + _subWorkflows = subWorkflows; } /// @@ -178,49 +252,724 @@ public IWorkflow Build(WorkflowDefinition definition) private void BuildSteps(IWorkflowBuilder builder, List steps) { foreach (var stepDef in steps) + BuildStep(builder, stepDef); + } + + private void BuildStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + // When TimeoutSeconds is configured, capture the built step via a temp builder and wrap it. + // This ensures timeout is applied to the entire composite step (not just its body steps). + if (stepDef.TimeoutSeconds is > 0) + { + var tempCapture = Workflow.Create("_capture"); + BuildStepCore(tempCapture, stepDef); + builder.Step(ApplyTimeout(tempCapture.Build().Steps[0], stepDef.TimeoutSeconds)); + } + else + { + BuildStepCore(builder, stepDef); + } + } + + private void BuildStepCore(IWorkflowBuilder builder, StepDefinition stepDef) + { + var typeCategory = stepDef.Type?.ToLowerInvariant() ?? string.Empty; + + if (KnownCategories.Contains(typeCategory)) + { + // New format: type is a composite step category + switch (typeCategory) + { + case "step": + var className = stepDef.Class + ?? throw new InvalidOperationException( + $"Step '{stepDef.Name ?? "unnamed"}' of type 'step' requires a 'class' property."); + builder.Step(ApplyName(_stepRegistry.Resolve(className), stepDef.Name)); + break; + + case "conditional": + BuildConditionalStep(builder, stepDef); + break; + + case "parallel": + BuildParallelStep(builder, stepDef); + break; + + case "foreach": + BuildForEachStep(builder, stepDef); + break; + + case "while": + BuildWhileStep(builder, stepDef); + break; + + case "dowhile": + BuildDoWhileStep(builder, stepDef); + break; + + case "retry": + BuildRetryGroupStep(builder, stepDef); + break; + + case "try": + BuildTryStep(builder, stepDef); + break; + + case "subworkflow": + BuildSubWorkflowStep(builder, stepDef); + break; + + case "approval": + BuildApprovalStep(builder, stepDef); + break; + + case "saga": + BuildSagaStep(builder, stepDef); + break; + } + } + else if (stepDef.Parallel != null && stepDef.Parallel.Count > 0) + { + // Legacy format: parallel with a flat list of class names + // Use a temp builder to capture the created step so we can apply the configured name. + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.Parallel(p => + { + foreach (var parallelType in stepDef.Parallel) + p.Step(_stepRegistry.Resolve(parallelType)); + }); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name)); + } + else if (stepDef.Condition != null && (stepDef.Then != null || stepDef.ThenSteps?.Count > 0)) + { + // Legacy conditional format — delegate to BuildConditionalStep so ApplyName is applied consistently. + BuildConditionalStep(builder, stepDef); + } + else if (stepDef.Retry != null && !string.IsNullOrEmpty(stepDef.Type)) + { + // Legacy format: single step with retry wrapping + // Use a temp builder to capture the created step so we can apply the configured name. + var retryStep = _stepRegistry.Resolve(stepDef.Type); + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.Retry(b => b.Step(retryStep), Math.Max(1, stepDef.Retry.MaxAttempts)); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name)); + } + else if (!string.IsNullOrEmpty(stepDef.Class)) + { + // New format shorthand: class without explicit category + builder.Step(ApplyName(_stepRegistry.Resolve(stepDef.Class), stepDef.Name)); + } + else if (!string.IsNullOrEmpty(stepDef.Type)) + { + // Legacy format: type is the class name + builder.Step(ApplyName(_stepRegistry.Resolve(stepDef.Type), stepDef.Name)); + } + else + { + throw new InvalidOperationException( + $"Step '{stepDef.Name ?? "unnamed"}' has no 'type' or 'class' specified."); + } + } + + private void BuildConditionalStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var conditionKey = stepDef.Condition + ?? throw new InvalidOperationException( + $"Conditional step '{stepDef.Name ?? "unnamed"}' requires a 'condition' property."); + + Func predicate = ctx => + { + ctx.Properties.TryGetValue(conditionKey, out var val); + return val is true or "true"; + }; + + // Prefer nested step definitions; fall back to legacy class-name strings + var thenSteps = stepDef.ThenSteps; + var elseSteps = stepDef.ElseSteps; + // Use the condition key as the default name so that multiple unnamed conditionals with + // different condition expressions produce unique branch-group names and don't collide in + // DefaultWorkflowValidator's duplicate-step-name check. + var stepName = stepDef.Name ?? conditionKey; + + IStep thenStep; + if (thenSteps != null && thenSteps.Count > 0) + { + thenStep = BuildStepsAsGroupStep($"{stepName}_then", thenSteps); + } + else if (stepDef.Then != null) + { + thenStep = _stepRegistry.Resolve(stepDef.Then); + } + else + { + throw new InvalidOperationException( + $"Conditional step '{stepDef.Name ?? "unnamed"}' requires 'then', 'thenSteps', or equivalent."); + } + + // Use a temp builder to capture the created ConditionalStep so we can apply the configured name. + var tempBuilder = Workflow.Create("_temp"); + if (elseSteps != null && elseSteps.Count > 0) + { + var elseStep = BuildStepsAsGroupStep($"{stepName}_else", elseSteps); + tempBuilder.If(predicate).Then(thenStep).Else(elseStep); + } + else if (stepDef.Else != null) + { + var elseStep = _stepRegistry.Resolve(stepDef.Else); + tempBuilder.If(predicate).Then(thenStep).Else(elseStep); + } + else + { + tempBuilder.If(predicate).Then(thenStep).EndIf(); + } + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepName)); + } + + private void BuildParallelStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var childSteps = stepDef.Steps; + if (childSteps == null || childSteps.Count == 0) + throw new InvalidOperationException( + $"Parallel step '{stepDef.Name ?? "unnamed"}' requires a non-empty 'steps' list."); + + // Use a temp builder to capture the created step so we can apply the configured name. + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.Parallel(p => + { + for (var i = 0; i < childSteps.Count; i++) + { + var child = childSteps[i]; + // Build each branch step directly (not through InlineWorkflowStep) so that exceptions + // from a failing branch propagate as-thrown, giving WorkflowStatus.Faulted on the + // outer workflow. Wrapping via InlineWorkflowStep would absorb the exception and set + // IsAborted instead, silently swallowing the fault and breaking ParallelErrorTests. + var branchBuilder = Workflow.Create("_branch"); + BuildStep(branchBuilder, child); + p.Step(branchBuilder.Build().Steps[0]); + } + }); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name)); + } + + private void BuildForEachStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var bodySteps = stepDef.Steps ?? []; + var itemsKey = stepDef.Condition ?? "items"; + + // Use a temp builder to capture the created step so we can apply the configured name. + // Fall back to itemsKey so multiple unnamed foreach steps with different item sources + // produce distinct step names and pass DefaultWorkflowValidator. + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.ForEach( + ctx => + { + if (!ctx.Properties.TryGetValue(itemsKey, out var col)) return Array.Empty(); + // Accept typed IEnumerable directly. + if (col is IEnumerable typed) return typed; + // Accept any non-string IEnumerable and project to object. + if (col is System.Collections.IEnumerable enumerable and not string) + return enumerable.Cast(); + return Array.Empty(); + }, + b => BuildSteps(b, bodySteps)); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name ?? itemsKey)); + } + + private void BuildWhileStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var conditionKey = stepDef.Condition + ?? throw new InvalidOperationException( + $"While step '{stepDef.Name ?? "unnamed"}' requires a 'condition' property."); + var bodySteps = stepDef.Steps ?? []; + + // Use a temp builder to capture the created step so we can apply the configured name. + // Fall back to conditionKey so multiple unnamed while steps with different conditions + // produce distinct step names and pass DefaultWorkflowValidator. + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.While( + ctx => + { + ctx.Properties.TryGetValue(conditionKey, out var val); + return val is true or "true"; + }, + b => BuildSteps(b, bodySteps)); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name ?? conditionKey)); + } + + private void BuildDoWhileStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var conditionKey = stepDef.Condition + ?? throw new InvalidOperationException( + $"DoWhile step '{stepDef.Name ?? "unnamed"}' requires a 'condition' property."); + var bodySteps = stepDef.Steps ?? []; + + // Use a temp builder to capture the created step so we can apply the configured name. + // Fall back to conditionKey so multiple unnamed dowhile steps with different conditions + // produce distinct step names and pass DefaultWorkflowValidator. + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.DoWhile( + b => BuildSteps(b, bodySteps), + ctx => + { + ctx.Properties.TryGetValue(conditionKey, out var val); + return val is true or "true"; + }); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name ?? conditionKey)); + } + + private void BuildRetryGroupStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var bodySteps = stepDef.Steps ?? []; + if (bodySteps.Count == 0) + throw new InvalidOperationException( + $"Retry step '{stepDef.Name ?? "unnamed"}' requires a non-empty 'steps' list."); + + var maxAttempts = Math.Max(1, stepDef.Retry?.MaxAttempts ?? 3); + // Use a temp builder to capture the created step so we can apply the configured name. + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.Retry(b => BuildSteps(b, bodySteps), maxAttempts); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name)); + } + + private void BuildTryStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var tryBody = stepDef.Steps ?? stepDef.ThenSteps ?? []; + // FinallySteps is the dedicated finally-body; fall back to the legacy ElseSteps repurposing. + var finallyBody = stepDef.FinallySteps ?? stepDef.ElseSteps ?? []; + var catchDefs = stepDef.Catch ?? []; + + // Use a temp builder to capture the created TryCatchStep so we can apply the configured name. + var tempBuilder = Workflow.Create("_temp"); + var tryCatchBuilder = tempBuilder.Try(b => BuildSteps(b, tryBody)); + + foreach (var catchDef in catchDefs) + { + var exType = ResolveExceptionType(catchDef.Exception); + var catchSteps = catchDef.Steps.ToList(); + + // Build the catch workflow once so it is not reconstructed on every exception. + var catchBodyBuilder = Workflow.Create("catch"); + BuildSteps(catchBodyBuilder, catchSteps); + var catchWorkflow = catchBodyBuilder.Build(); + + Func handler = async (ctx, _) => + { + var result = await catchWorkflow.ExecuteAsync(ctx).ConfigureAwait(false); + if (!result.IsSuccess) + ctx.IsAborted = true; + }; + + // Use reflection to call the generic Catch with the resolved exception type. + var catchMethod = typeof(ITryCatchBuilder) + .GetMethod(nameof(ITryCatchBuilder.Catch))! + .MakeGenericMethod(exType); + tryCatchBuilder = (ITryCatchBuilder)catchMethod.Invoke(tryCatchBuilder, new object[] { handler })!; + } + + if (finallyBody.Count > 0) + tryCatchBuilder.Finally(b => BuildSteps(b, finallyBody)); + else + tryCatchBuilder.EndTry(); + + // Derive a unique default name from try-body step identifiers and caught exception types so + // multiple unnamed try blocks in the same workflow don't all resolve to "Try" and collide in + // DefaultWorkflowValidator. + var tryKey = stepDef.Name ?? BuildCompositeKey(tryBody, catchDefs); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], tryKey)); + } + + /// + /// Resolves an exception type by name. Tries assembly-qualified lookup, the System. prefix, + /// and then scans all loaded assemblies by FullName and short Name. Falls back to + /// if the type cannot be resolved. Results are cached to avoid repeated scans. + /// + private static Type ResolveExceptionType(string typeName) + { + if (string.IsNullOrEmpty(typeName)) return typeof(Exception); + + return ExceptionTypeCache.GetOrAdd(typeName, static name => { - if (stepDef.Parallel != null && stepDef.Parallel.Count > 0) + // Try assembly-qualified or fully-qualified name first. + // Guard each result: Type.GetType may return non-Exception types (e.g. System.IO.Stream), + // which would cause MakeGenericMethod(Catch) to throw at runtime. + var resolved = Type.GetType(name); + if (resolved != null && typeof(Exception).IsAssignableFrom(resolved)) return resolved; + + resolved = Type.GetType($"System.{name}"); + if (resolved != null && typeof(Exception).IsAssignableFrom(resolved)) return resolved; + + // Scan all loaded assemblies to find the type by full or short name. + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { - builder.Parallel(p => + // Fast path: try GetType before iterating all types. + var candidate = assembly.GetType(name); + if (candidate != null && typeof(Exception).IsAssignableFrom(candidate)) + return candidate; + + // GetTypes() can throw ReflectionTypeLoadException for partially-loaded assemblies. + // Use ex.Types (non-null entries) to continue scanning rather than aborting. + Type[] types; + try { types = assembly.GetTypes(); } + catch (ReflectionTypeLoadException ex) { - foreach (var parallelType in stepDef.Parallel) - { - p.Step(_stepRegistry.Resolve(parallelType)); - } - }); + var loaded = ex.Types; + var nonNull = new List(loaded.Length); + foreach (var t in loaded) + if (t != null) nonNull.Add(t!); + types = nonNull.ToArray(); + } + + foreach (var type in types) + { + if (!typeof(Exception).IsAssignableFrom(type)) continue; + if (type.FullName == name || type.Name == name) + return type; + } } - else if (stepDef.Condition != null && stepDef.Then != null) + + return typeof(Exception); + }); + } + + private void BuildSubWorkflowStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var key = stepDef.SubWorkflow ?? stepDef.Class + ?? throw new InvalidOperationException( + "Sub-workflow step requires 'subWorkflow' or 'class' to identify the workflow."); + + if (_subWorkflows == null || !_subWorkflows.TryGetValue(key, out var wf)) + { + var available = _subWorkflows?.Count > 0 + ? $"Available sub-workflows: [{string.Join(", ", _subWorkflows.Keys)}]." + : "No sub-workflows are registered."; + throw new InvalidOperationException($"Sub-workflow '{key}' is not registered. {available}"); + } + + // Use a temp builder to capture the SubWorkflowStep so we can apply the configured name. + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.SubWorkflow(wf); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name)); + } + + private void BuildApprovalStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + // Try to resolve a registered approval step (using 'class' when provided); otherwise create a simple recording step. + var stepKey = string.IsNullOrWhiteSpace(stepDef.Class) ? "approval" : stepDef.Class; + try + { + var approvalStep = _stepRegistry.Resolve(stepKey); + builder.Step(ApplyName(approvalStep, stepDef.Name)); + } + catch (KeyNotFoundException) + { + var stepName = stepDef.Name + ?? (string.IsNullOrWhiteSpace(stepDef.Message) ? "Approval" : stepDef.Message); + var message = stepDef.Message ?? "Approval required"; + var timeoutMinutes = stepDef.TimeoutMinutes; + builder.Step(stepName, ctx => + { + ctx.Properties[$"{stepName}.Message"] = message; + ctx.Properties[$"{stepName}.RequiredApprovers"] = stepDef.RequiredApprovers ?? 1; + // Only record TimeoutMinutes when explicitly configured; null means no timeout was set. + if (timeoutMinutes.HasValue) + ctx.Properties[$"{stepName}.TimeoutMinutes"] = timeoutMinutes.Value; + ctx.Properties[$"{stepName}.Status"] = "Pending"; + return Task.CompletedTask; + }); + } + } + + private void BuildSagaStep(IWorkflowBuilder builder, StepDefinition stepDef) + { + var bodySteps = stepDef.Steps ?? []; + if (bodySteps.Count == 0) + throw new InvalidOperationException( + $"Saga step '{stepDef.Name ?? "unnamed"}' requires a non-empty 'steps' list."); + + // Derive a unique default name when stepDef.Name is absent so multiple unnamed sagas + // in the same workflow don't collide in DefaultWorkflowValidator. Use BuildCompositeKey + // which incorporates per-step Name/Class/Type/Condition/SubWorkflow/Message, so composite + // body steps (conditional/try/while/etc.) produce richer identifiers than plain "conditional". + var sagaKey = stepDef.Name ?? BuildCompositeKey(bodySteps); + + // Build a compensating sub-workflow for the saga group + var sagaBuilder = Workflow.Create(sagaKey); + sagaBuilder.WithCompensation(); + BuildSteps(sagaBuilder, bodySteps); + var sagaWorkflow = sagaBuilder.Build(); + + // Use a temp builder to capture the SubWorkflowStep so we can apply the configured name. + var tempBuilder = Workflow.Create("_temp"); + tempBuilder.SubWorkflow(sagaWorkflow); + builder.Step(ApplyName(tempBuilder.Build().Steps[0], stepDef.Name)); + } + + /// + /// Builds a list of step definitions into a single . + /// The result is always an named + /// so that callers (e.g., conditional branch builders) can rely on the group name being + /// reflected in the resulting step's , preventing duplicate step-name + /// validation failures when multiple branches share the same leaf step type. + /// + private IStep BuildStepsAsGroupStep(string groupName, List steps) + { + if (steps.Count == 0) + throw new InvalidOperationException($"Step group '{groupName}' is empty."); + + // Always wrap in an InlineWorkflowStep so the groupName is preserved as the step name. + // This prevents duplicate-step-name failures when multiple conditional branches contain + // identically-named leaf steps (the ConditionalStep.Name is derived from its branch names). + var subBuilder = Workflow.Create(groupName); + BuildSteps(subBuilder, steps); + var subWorkflow = subBuilder.Build(); + return new InlineWorkflowStep(groupName, subWorkflow); + } + + /// + /// An inline step that executes a workflow — used when multiple steps must be grouped + /// for a conditional Then/Else branch. Mirrors SubWorkflowStep semantics: sets + /// when the grouped workflow does not succeed so + /// that subsequent steps in the outer workflow are skipped when a branch step fails. + /// + private sealed class InlineWorkflowStep(string name, IWorkflow workflow) : IStep + { + public string Name => name; + + public async Task ExecuteAsync(IWorkflowContext context) + { + var result = await workflow.ExecuteAsync(context).ConfigureAwait(false); + if (!result.IsSuccess) + context.IsAborted = true; + } + } + + /// + /// Wraps an and overrides its without affecting + /// interface membership. Used when the inner step does not implement . + /// + private sealed class NamedStep(string name, IStep inner) : IStep + { + public string Name => name; + public Task ExecuteAsync(IWorkflowContext context) => inner.ExecuteAsync(context); + } + + /// + /// Wraps an and overrides its , + /// delegating to the inner step so that + /// saga compensation is not silently lost through the name override. + /// + private sealed class NamedCompensatingStep(string name, ICompensatingStep inner) : ICompensatingStep + { + public string Name => name; + public Task ExecuteAsync(IWorkflowContext context) => inner.ExecuteAsync(context); + public Task CompensateAsync(IWorkflowContext context) => inner.CompensateAsync(context); + } + + /// + /// Applies to when the name is non-empty + /// and different from the step's existing . + /// Preserves membership when the inner step implements it. + /// + private static IStep ApplyName(IStep step, string? overrideName) + { + if (string.IsNullOrWhiteSpace(overrideName) || overrideName == step.Name) + return step; + return step is ICompensatingStep comp + ? new NamedCompensatingStep(overrideName, comp) + : new NamedStep(overrideName, step); + } + + /// + /// Wraps in a (or + /// for compensating steps) when + /// is positive. Returns the step unchanged when the + /// value is null or <= 0. The wrapper preserves the inner step's + /// so that the configured step name remains visible in the built workflow. + /// + private static IStep ApplyTimeout(IStep step, double? timeoutSeconds) + { + if (timeoutSeconds is null or <= 0) + return step; + var timeout = TimeSpan.FromSeconds(timeoutSeconds.Value); + return step is ICompensatingStep comp + ? new TimeoutCompensatingStepWrapper(comp, timeout) + : new TimeoutStepWrapper(step, timeout); + } + + /// + /// Builds a deterministic composite key from a list of step definitions and optional catch + /// definitions, used as a unique fallback name when the caller has not supplied an explicit + /// step name. Incorporating per-step distinguishing fields (Name, Class, Type, Condition, + /// SubWorkflow, Message) and the caught exception types reduces collisions when multiple + /// unnamed composite steps of the same type appear in the same workflow. + /// + private static string BuildCompositeKey( + IReadOnlyList steps, + IReadOnlyList? catches = null) + { + var stepPart = string.Join("::", steps.Select(GetStepIdentifier)); + + if (catches is { Count: > 0 }) + { + var catchPart = string.Join(",", catches.Select(c => c.Exception ?? "Exception")); + return $"{stepPart}#{catchPart}"; + } + + return stepPart; + } + + /// + /// Returns a short, deterministic identifier for a step definition used as a component of a + /// composite key. Prefers Name, then Class, and finally falls back to + /// Type optionally qualified by the first distinguishing field + /// (Condition, SubWorkflow, or Message) to avoid generic-type collisions. + /// + private static string GetStepIdentifier(StepDefinition s) + { + if (s.Name is { Length: > 0 }) return s.Name; + if (s.Class is { Length: > 0 }) return s.Class; + + var baseType = s.Type ?? "step"; + var qualifier = s.Condition ?? s.SubWorkflow ?? s.Message; + return qualifier is { Length: > 0 } ? $"{baseType}({qualifier})" : baseType; + } + + /// + /// Wraps an to substitute a timeout-linked + /// while delegating all other members to the original context. + /// + private sealed class TimeoutContextWrapper(IWorkflowContext inner, CancellationToken cancellationToken) + : IWorkflowContext + { + public string WorkflowId => inner.WorkflowId; + public string CorrelationId => inner.CorrelationId; + public CancellationToken CancellationToken { get; } = cancellationToken; + public IDictionary Properties => inner.Properties; + public string? CurrentStepName { get => inner.CurrentStepName; set => inner.CurrentStepName = value; } + public int CurrentStepIndex { get => inner.CurrentStepIndex; set => inner.CurrentStepIndex = value; } + public bool IsAborted { get => inner.IsAborted; set => inner.IsAborted = value; } + public IList Errors => inner.Errors; + } + + /// + /// Executes an inner with a wall-clock timeout enforced by racing the + /// step task against . A cooperative cancellation signal + /// is also sent to the inner step's context token so that well-behaved steps can stop early. + /// Throws if the step does not complete within the allotted + /// time, regardless of whether the inner step observes the . + /// Used when the inner step does not implement . + /// + private sealed class TimeoutStepWrapper(IStep inner, TimeSpan timeout) : IStep + { + public string Name => inner.Name; + + public async Task ExecuteAsync(IWorkflowContext context) + { + using var cts = CancellationTokenSource.CreateLinkedTokenSource(context.CancellationToken); + cts.CancelAfter(timeout); // cooperative signal to the inner step + var timeoutContext = new TimeoutContextWrapper(context, cts.Token); + + using var delayCts = new CancellationTokenSource(); + var stepTask = inner.ExecuteAsync(timeoutContext); + var delayTask = Task.Delay(timeout, delayCts.Token); + try { - // Conditional step: condition is a step type name used as a property key check - var thenStep = _stepRegistry.Resolve(stepDef.Then); - if (stepDef.Else != null) + var first = await Task.WhenAny(stepTask, delayTask).ConfigureAwait(false); + // Guard against the simultaneous-completion race: Task.WhenAny may return delayTask + // even when stepTask completed at essentially the same instant. Only treat it as a + // true timeout when the delay won *and* the step has not yet completed. + if (first != stepTask && !stepTask.IsCompleted) { - var elseStep = _stepRegistry.Resolve(stepDef.Else); - builder.If(ctx => - { - ctx.Properties.TryGetValue(stepDef.Condition, out var val); - return val is true or "true"; - }).Then(thenStep).Else(elseStep); + // Observe the abandoned task to avoid UnobservedTaskException when the inner step + // eventually faults or cancels after we have already thrown the TimeoutException. + _ = stepTask.ContinueWith( + static t => _ = t.Exception, + CancellationToken.None, + TaskContinuationOptions.OnlyOnFaulted, + TaskScheduler.Default); + throw new TimeoutException($"Step '{inner.Name}' timed out after {timeout}."); } - else + + // Propagate step exceptions — convert OCE from our own timeout CTS to TimeoutException + // so callers see a consistent TimeoutException instead of OperationCanceledException. + // Only convert when our own CTS triggered the cancellation and the outer context token + // is not the reason — this prevents misreporting inner-step self-cancellations as timeouts. + try + { + await stepTask.ConfigureAwait(false); + } + catch (OperationCanceledException) when (cts.IsCancellationRequested && !context.CancellationToken.IsCancellationRequested) { - builder.If(ctx => - { - ctx.Properties.TryGetValue(stepDef.Condition, out var val); - return val is true or "true"; - }).Then(thenStep).EndIf(); + throw new TimeoutException($"Step '{inner.Name}' timed out after {timeout}."); } } - else if (stepDef.Retry != null && !string.IsNullOrEmpty(stepDef.Type)) + finally + { + delayCts.Cancel(); // ensure the delay task is always cleaned up + } + } + } + + /// + /// Executes an inner with a wall-clock timeout enforced by + /// racing the step task against . A cooperative cancellation + /// signal is also sent to the inner step's context token so that well-behaved steps can stop + /// early. Throws if the step does not complete within the + /// allotted time, regardless of whether the inner step observes the . + /// Delegates to the inner step so that saga + /// compensation is not silently lost through the timeout wrapper. + /// + private sealed class TimeoutCompensatingStepWrapper(ICompensatingStep inner, TimeSpan timeout) + : ICompensatingStep + { + public string Name => inner.Name; + + public async Task ExecuteAsync(IWorkflowContext context) + { + using var cts = CancellationTokenSource.CreateLinkedTokenSource(context.CancellationToken); + cts.CancelAfter(timeout); // cooperative signal to the inner step + var timeoutContext = new TimeoutContextWrapper(context, cts.Token); + + using var delayCts = new CancellationTokenSource(); + var stepTask = inner.ExecuteAsync(timeoutContext); + var delayTask = Task.Delay(timeout, delayCts.Token); + try { - var retryStep = _stepRegistry.Resolve(stepDef.Type); - builder.Retry(b => b.Step(retryStep), stepDef.Retry.MaxAttempts); + var first = await Task.WhenAny(stepTask, delayTask).ConfigureAwait(false); + // Guard against the simultaneous-completion race: Task.WhenAny may return delayTask + // even when stepTask completed at essentially the same instant. Only treat it as a + // true timeout when the delay won *and* the step has not yet completed. + if (first != stepTask && !stepTask.IsCompleted) + { + // Observe the abandoned task to avoid UnobservedTaskException when the inner step + // eventually faults or cancels after we have already thrown the TimeoutException. + _ = stepTask.ContinueWith( + static t => _ = t.Exception, + CancellationToken.None, + TaskContinuationOptions.OnlyOnFaulted, + TaskScheduler.Default); + throw new TimeoutException($"Step '{inner.Name}' timed out after {timeout}."); + } + + // Propagate step exceptions — convert OCE from our own timeout CTS to TimeoutException + // so callers see a consistent TimeoutException instead of OperationCanceledException. + // Only convert when our own CTS triggered the cancellation and the outer context token + // is not the reason — this prevents misreporting inner-step self-cancellations as timeouts. + try + { + await stepTask.ConfigureAwait(false); + } + catch (OperationCanceledException) when (cts.IsCancellationRequested && !context.CancellationToken.IsCancellationRequested) + { + throw new TimeoutException($"Step '{inner.Name}' timed out after {timeout}."); + } } - else + finally { - var step = _stepRegistry.Resolve(stepDef.Type); - builder.Step(step); + delayCts.Cancel(); // ensure the delay task is always cleaned up } } + + public Task CompensateAsync(IWorkflowContext context) => inner.CompensateAsync(context); } } diff --git a/src/WorkflowFramework.Extensions.Configuration/ServiceCollectionExtensions.cs b/src/WorkflowFramework.Extensions.Configuration/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..d440797 --- /dev/null +++ b/src/WorkflowFramework.Extensions.Configuration/ServiceCollectionExtensions.cs @@ -0,0 +1,57 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace WorkflowFramework.Extensions.Configuration; + +/// +/// Extension methods for registering workflow definition loader services. +/// +public static class WorkflowDefinitionLoaderServiceCollectionExtensions +{ + /// + /// Registers as the + /// implementation in the dependency-injection container. + /// + /// The service collection. + /// The service collection for chaining. + public static IServiceCollection AddYamlWorkflowLoader(this IServiceCollection services) + { + services.AddSingleton(); + return services; + } + + /// + /// Registers as the + /// implementation in the dependency-injection container. + /// + /// The service collection. + /// The service collection for chaining. + public static IServiceCollection AddJsonWorkflowLoader(this IServiceCollection services) + { + services.AddSingleton(); + return services; + } + + /// + /// Registers as both and the concrete + /// type in the dependency-injection container. + /// + /// The service collection. + /// The service collection for chaining. + public static IServiceCollection AddStepRegistry(this IServiceCollection services) + { + services.AddSingleton(); + services.AddSingleton(sp => sp.GetRequiredService()); + return services; + } + + /// + /// Registers in the dependency-injection container. + /// + /// The service collection. + /// The service collection for chaining. + public static IServiceCollection AddWorkflowDefinitionBuilder(this IServiceCollection services) + { + services.AddTransient(); + return services; + } +} diff --git a/src/WorkflowFramework.Extensions.Configuration/WorkflowDefinition.cs b/src/WorkflowFramework.Extensions.Configuration/WorkflowDefinition.cs index d6f4d78..879fe98 100644 --- a/src/WorkflowFramework.Extensions.Configuration/WorkflowDefinition.cs +++ b/src/WorkflowFramework.Extensions.Configuration/WorkflowDefinition.cs @@ -19,6 +19,12 @@ public sealed class WorkflowDefinition [JsonPropertyName("version")] public int Version { get; set; } = 1; + /// + /// Gets or sets an optional description of the workflow. + /// + [JsonPropertyName("description")] + public string? Description { get; set; } + /// /// Gets or sets the workflow steps. /// @@ -38,11 +44,25 @@ public sealed class WorkflowDefinition public sealed class StepDefinition { /// - /// Gets or sets the step type name (resolved via IStepRegistry). + /// Gets or sets the step type name (resolved via IStepRegistry) or a composite step category + /// (step, conditional, parallel, foreach, while, dowhile, retry, try, subworkflow, approval, saga). /// [JsonPropertyName("type")] public string Type { get; set; } = string.Empty; + /// + /// Gets or sets the optional step class name. Interpretation depends on : + /// + /// When type is "step" or omitted, this value is resolved via the step registry. + /// When type is "subworkflow", this value identifies the named sub-workflow. + /// When type is "approval", this value is the registry key for a custom approval step + /// (falls back to the built-in approval recording step when not found). + /// For other composite categories this field may be unused or have category-specific semantics. + /// + /// + [JsonPropertyName("class")] + public string? Class { get; set; } + /// /// Gets or sets an optional step name override. /// @@ -50,23 +70,56 @@ public sealed class StepDefinition public string? Name { get; set; } /// - /// Gets or sets the condition expression (for If steps). + /// Gets or sets the condition expression key. + /// + /// For conditional, while, and dowhile steps: the property key whose value is + /// checked to be true or "true" (via ctx.Properties[Condition]). + /// For foreach steps: the property key whose value is the items collection to iterate + /// (must implement ). Defaults to "items" when not set. + /// /// [JsonPropertyName("condition")] public string? Condition { get; set; } /// - /// Gets or sets the then step type (for If steps). + /// Gets or sets the then step class name for a conditional (legacy single-class format). + /// Use for rich nested step definitions. /// [JsonPropertyName("then")] public string? Then { get; set; } /// - /// Gets or sets the else step type (for If steps). + /// Gets or sets the else step class name for a conditional (legacy single-class format). + /// Use for rich nested step definitions. /// [JsonPropertyName("else")] public string? Else { get; set; } + /// + /// Gets or sets the then-branch step definitions for a conditional step (new nested format), + /// or the try-body steps for a try step when is not set. + /// Precedence for type: try: is used first; is + /// the fallback for backward compatibility. Prefer for new try-body definitions + /// and for the finally-body. + /// + [JsonPropertyName("thenSteps")] + public List? ThenSteps { get; set; } + + /// + /// Gets or sets the else-branch step definitions for a conditional step (new nested format). + /// Also used as the finally-body for a try step when is not set + /// (legacy — prefer for try/finally definitions). + /// + [JsonPropertyName("elseSteps")] + public List? ElseSteps { get; set; } + + /// + /// Gets or sets the finally-body step definitions for a type: try step. + /// Takes precedence over the legacy repurposing for try/finally. + /// + [JsonPropertyName("finallySteps")] + public List? FinallySteps { get; set; } + /// /// Gets or sets retry configuration. /// @@ -80,28 +133,61 @@ public sealed class StepDefinition public double? TimeoutSeconds { get; set; } /// - /// Gets or sets parallel step types. + /// Gets or sets parallel step types (legacy format — list of class names). + /// Use = "parallel" with for the rich format. /// [JsonPropertyName("parallel")] public List? Parallel { get; set; } /// - /// Gets or sets loop configuration (for While/DoWhile steps). + /// Gets or sets loop configuration (for forEach/while/doWhile steps). /// + /// + /// Note: This property is not currently read by WorkflowDefinitionBuilder. + /// The loop variant is driven by ("foreach", "while", or + /// "dowhile"), the loop condition by , and the loop body by + /// . is reserved for a future + /// release and has no runtime effect at this time. + /// [JsonPropertyName("loop")] public LoopDefinition? Loop { get; set; } /// - /// Gets or sets sub-workflow name. + /// Gets or sets sub-workflow name (for subworkflow type). /// [JsonPropertyName("subWorkflow")] public string? SubWorkflow { get; set; } /// - /// Gets or sets the child steps (for loop body, conditional branches, etc.). + /// Gets or sets the child steps (for composite step types such as parallel, retry, loop, try, saga). /// [JsonPropertyName("steps")] public List? Steps { get; set; } + + /// + /// Gets or sets the human-readable message shown during an approval step. + /// + [JsonPropertyName("message")] + public string? Message { get; set; } + + /// + /// Gets or sets the minimum number of approvers required (for approval steps). + /// + [JsonPropertyName("requiredApprovers")] + public int? RequiredApprovers { get; set; } + + /// + /// Gets or sets the approval timeout in minutes (for approval steps). + /// + [JsonPropertyName("timeoutMinutes")] + public int? TimeoutMinutes { get; set; } + + /// + /// Gets or sets the catch handler definitions (for type: try steps). + /// Each handler specifies the exception type and the steps to execute when that exception is thrown. + /// + [JsonPropertyName("catch")] + public List? Catch { get; set; } } /// @@ -145,3 +231,23 @@ public sealed class RetryDefinition [JsonPropertyName("baseDelayMs")] public int BaseDelayMs { get; set; } = 100; } + +/// +/// Defines a catch block for a type: try step. +/// +public sealed class CatchDefinition +{ + /// + /// Gets or sets the fully-qualified or short exception type name to catch + /// (e.g. "Exception", "InvalidOperationException"). + /// If the type cannot be resolved at runtime, is used as the fallback. + /// + [JsonPropertyName("exception")] + public string Exception { get; set; } = "Exception"; + + /// + /// Gets or sets the steps to execute when the exception is caught. + /// + [JsonPropertyName("steps")] + public List Steps { get; set; } = new(); +} diff --git a/src/WorkflowFramework.Extensions.Configuration/WorkflowFramework.Extensions.Configuration.csproj b/src/WorkflowFramework.Extensions.Configuration/WorkflowFramework.Extensions.Configuration.csproj index be0508c..eb59946 100644 --- a/src/WorkflowFramework.Extensions.Configuration/WorkflowFramework.Extensions.Configuration.csproj +++ b/src/WorkflowFramework.Extensions.Configuration/WorkflowFramework.Extensions.Configuration.csproj @@ -7,6 +7,7 @@ + diff --git a/src/WorkflowFramework.Extensions.Configuration/packages.lock.json b/src/WorkflowFramework.Extensions.Configuration/packages.lock.json index d05242e..f51c524 100644 --- a/src/WorkflowFramework.Extensions.Configuration/packages.lock.json +++ b/src/WorkflowFramework.Extensions.Configuration/packages.lock.json @@ -2,6 +2,16 @@ "version": 2, "dependencies": { ".NETStandard,Version=v2.0": { + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Direct", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", @@ -129,6 +139,12 @@ } }, ".NETStandard,Version=v2.1": { + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Direct", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", @@ -201,6 +217,12 @@ } }, "net10.0": { + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Direct", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" + }, "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", @@ -270,12 +292,6 @@ "Microsoft.Extensions.Hosting.Abstractions": "[10.0.3, )" } }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "10.0.3", - "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "CentralTransitive", "requested": "[10.0.3, )", @@ -310,6 +326,12 @@ } }, "net8.0": { + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Direct", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" + }, "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", @@ -394,12 +416,6 @@ "Microsoft.Extensions.Hosting.Abstractions": "[10.0.3, )" } }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "10.0.3", - "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "CentralTransitive", "requested": "[10.0.3, )", @@ -441,6 +457,12 @@ } }, "net9.0": { + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Direct", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" + }, "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", @@ -525,12 +547,6 @@ "Microsoft.Extensions.Hosting.Abstractions": "[10.0.3, )" } }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "10.0.3", - "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "CentralTransitive", "requested": "[10.0.3, )", diff --git a/src/WorkflowFramework.Extensions.DataMapping.Formats/packages.lock.json b/src/WorkflowFramework.Extensions.DataMapping.Formats/packages.lock.json index a7db023..276fb70 100644 --- a/src/WorkflowFramework.Extensions.DataMapping.Formats/packages.lock.json +++ b/src/WorkflowFramework.Extensions.DataMapping.Formats/packages.lock.json @@ -300,6 +300,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -340,6 +341,12 @@ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", "Microsoft.Extensions.Primitives": "10.0.3" } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.1", + "contentHash": "EsgwDgU1PFqhrFA9l5n+RBu76wFhNGCEwu8ITrBNhjPP3MxLyklroU5GIF8o6JYpYg6T4KD/VICfMdgPAvNp5g==" } }, "net8.0": { diff --git a/src/WorkflowFramework.Extensions.DataMapping.Schema/packages.lock.json b/src/WorkflowFramework.Extensions.DataMapping.Schema/packages.lock.json index 46a1bf6..c230bb6 100644 --- a/src/WorkflowFramework.Extensions.DataMapping.Schema/packages.lock.json +++ b/src/WorkflowFramework.Extensions.DataMapping.Schema/packages.lock.json @@ -288,6 +288,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, diff --git a/src/WorkflowFramework.Extensions.Distributed.PostgreSQL/packages.lock.json b/src/WorkflowFramework.Extensions.Distributed.PostgreSQL/packages.lock.json index d1faae5..9950f90 100644 --- a/src/WorkflowFramework.Extensions.Distributed.PostgreSQL/packages.lock.json +++ b/src/WorkflowFramework.Extensions.Distributed.PostgreSQL/packages.lock.json @@ -83,6 +83,7 @@ "workflowframework.extensions.distributed": { "type": "Project", "dependencies": { + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, diff --git a/src/WorkflowFramework.Extensions.Distributed.Redis/packages.lock.json b/src/WorkflowFramework.Extensions.Distributed.Redis/packages.lock.json index 3ee896d..51f2228 100644 --- a/src/WorkflowFramework.Extensions.Distributed.Redis/packages.lock.json +++ b/src/WorkflowFramework.Extensions.Distributed.Redis/packages.lock.json @@ -71,7 +71,15 @@ "Pipelines.Sockets.Unofficial": { "type": "Transitive", "resolved": "2.2.8", - "contentHash": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==" + "contentHash": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "dependencies": { + "System.IO.Pipelines": "5.0.1" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "5.0.1", + "contentHash": "qEePWsaq9LoEEIqhbGe6D5J8c9IqQOUuTzzV6wn1POlfdLkJliZY3OlB0j0f17uMWlqZYjH7txj+2YbyrIA8Yg==" }, "workflowframework": { "type": "Project", @@ -83,6 +91,7 @@ "workflowframework.extensions.distributed": { "type": "Project", "dependencies": { + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, diff --git a/src/WorkflowFramework.Extensions.Persistence.PostgreSQL/packages.lock.json b/src/WorkflowFramework.Extensions.Persistence.PostgreSQL/packages.lock.json index 64607e4..f0f6555 100644 --- a/src/WorkflowFramework.Extensions.Persistence.PostgreSQL/packages.lock.json +++ b/src/WorkflowFramework.Extensions.Persistence.PostgreSQL/packages.lock.json @@ -121,6 +121,7 @@ "dependencies": { "Microsoft.EntityFrameworkCore": "[9.0.6, )", "Microsoft.EntityFrameworkCore.Relational": "[9.0.6, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -197,6 +198,12 @@ "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "8.0.2" } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.1", + "contentHash": "EsgwDgU1PFqhrFA9l5n+RBu76wFhNGCEwu8ITrBNhjPP3MxLyklroU5GIF8o6JYpYg6T4KD/VICfMdgPAvNp5g==" } }, "net8.0": { diff --git a/src/WorkflowFramework.Extensions.Persistence.SqlServer/packages.lock.json b/src/WorkflowFramework.Extensions.Persistence.SqlServer/packages.lock.json index e17ba5c..7c43ae0 100644 --- a/src/WorkflowFramework.Extensions.Persistence.SqlServer/packages.lock.json +++ b/src/WorkflowFramework.Extensions.Persistence.SqlServer/packages.lock.json @@ -12,7 +12,9 @@ "Microsoft.EntityFrameworkCore.Relational": "9.0.6", "Microsoft.Extensions.Caching.Memory": "9.0.6", "Microsoft.Extensions.Configuration.Abstractions": "9.0.6", - "Microsoft.Extensions.Logging": "9.0.6" + "Microsoft.Extensions.Logging": "9.0.6", + "System.Formats.Asn1": "9.0.6", + "System.Text.Json": "9.0.6" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { @@ -38,7 +40,12 @@ "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "1.1.1", "System.ClientModel": "1.0.0", - "System.Memory.Data": "1.0.2" + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Memory.Data": "1.0.2", + "System.Numerics.Vectors": "4.5.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" } }, "Azure.Identity": { @@ -49,7 +56,10 @@ "Azure.Core": "1.38.0", "Microsoft.Identity.Client": "4.61.3", "Microsoft.Identity.Client.Extensions.Msal": "4.61.3", - "System.Security.Cryptography.ProtectedData": "4.7.0" + "System.Memory": "4.5.4", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Bcl.AsyncInterfaces": { @@ -62,6 +72,11 @@ "resolved": "8.0.0", "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, "Microsoft.Data.SqlClient": { "type": "Transitive", "resolved": "5.1.6", @@ -74,7 +89,12 @@ "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", "Microsoft.SqlServer.Server": "1.0.0", "System.Configuration.ConfigurationManager": "6.0.1", - "System.Runtime.Caching": "6.0.0" + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Runtime.Caching": "6.0.0", + "System.Security.Cryptography.Cng": "5.0.0", + "System.Security.Principal.Windows": "5.0.0", + "System.Text.Encoding.CodePages": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" } }, "Microsoft.Data.SqlClient.SNI.runtime": { @@ -157,7 +177,8 @@ "resolved": "4.61.3", "contentHash": "naJo/Qm35Caaoxp5utcw+R8eU8ZtLz2ALh8S+gkekOYQ1oazfCQMWVT4NJ/FnHzdIJlm8dMz0oMpMGCabx5odA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0" + "Microsoft.IdentityModel.Abstractions": "6.35.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" } }, "Microsoft.Identity.Client.Extensions.Msal": { @@ -179,7 +200,10 @@ "resolved": "6.35.0", "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.35.0" + "Microsoft.IdentityModel.Tokens": "6.35.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2" } }, "Microsoft.IdentityModel.Logging": { @@ -213,9 +237,21 @@ "resolved": "6.35.0", "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", "dependencies": { - "Microsoft.IdentityModel.Logging": "6.35.0" + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.35.0", + "System.Security.Cryptography.Cng": "4.5.0" } }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "8.0.0", @@ -236,7 +272,8 @@ "resolved": "1.0.0", "contentHash": "I3CVkvxeqFYjIVEP59DnjbeoGNfo/+SZrCLpRz2v/g0gpCHaEMPtWSY0s9k/7jR1rAsLNg2z2u1JRB76tPjnIw==", "dependencies": { - "System.Memory.Data": "1.0.2" + "System.Memory.Data": "1.0.2", + "System.Text.Json": "4.7.2" } }, "System.Configuration.ConfigurationManager": { @@ -256,6 +293,11 @@ "Microsoft.Win32.SystemEvents": "6.0.0" } }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "9.0.6", + "contentHash": "8LbKs3WVqyDSszFZJA9Uxg9z+C6WbPbFTSPm/HjFEsWx49XWs0ueqaAKPWncvFJ8yl4H4C/RTnUMhCKoXkddkg==" + }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", "resolved": "6.35.0", @@ -265,10 +307,33 @@ "Microsoft.IdentityModel.Tokens": "6.35.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, "System.Memory.Data": { "type": "Transitive", "resolved": "1.0.2", - "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==" + "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==", + "dependencies": { + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.6.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } }, "System.Runtime.Caching": { "type": "Transitive", @@ -278,6 +343,24 @@ "System.Configuration.ConfigurationManager": "6.0.0" } }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==", + "dependencies": { + "System.Formats.Asn1": "5.0.0" + } + }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "6.0.0", @@ -288,9 +371,46 @@ "resolved": "6.0.0", "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", "dependencies": { + "System.Security.AccessControl": "6.0.0", "System.Windows.Extensions": "6.0.0" } }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, "System.Windows.Extensions": { "type": "Transitive", "resolved": "6.0.0", @@ -311,6 +431,7 @@ "dependencies": { "Microsoft.EntityFrameworkCore": "[9.0.6, )", "Microsoft.EntityFrameworkCore.Relational": "[9.0.6, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -378,6 +499,21 @@ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", "Microsoft.Extensions.Primitives": "10.0.3" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.1", + "contentHash": "EsgwDgU1PFqhrFA9l5n+RBu76wFhNGCEwu8ITrBNhjPP3MxLyklroU5GIF8o6JYpYg6T4KD/VICfMdgPAvNp5g==" } }, "net8.0": { diff --git a/tests/WorkflowFramework.Dashboard.Api.Tests/packages.lock.json b/tests/WorkflowFramework.Dashboard.Api.Tests/packages.lock.json index 7d66f39..c18d7f3 100644 --- a/tests/WorkflowFramework.Dashboard.Api.Tests/packages.lock.json +++ b/tests/WorkflowFramework.Dashboard.Api.Tests/packages.lock.json @@ -20,7 +20,8 @@ "Microsoft.Extensions.DependencyModel": "9.0.6", "Microsoft.Extensions.Logging": "9.0.6", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10", - "SQLitePCLRaw.core": "2.1.10" + "SQLitePCLRaw.core": "2.1.10", + "System.Text.Json": "9.0.6" } }, "Microsoft.NET.Test.Sdk": { @@ -128,7 +129,8 @@ "Microsoft.Extensions.Configuration.Abstractions": "9.0.6", "Microsoft.Extensions.DependencyModel": "9.0.6", "Microsoft.Extensions.Logging": "9.0.6", - "SQLitePCLRaw.core": "2.1.10" + "SQLitePCLRaw.core": "2.1.10", + "System.Text.Json": "9.0.6" } }, "Microsoft.Extensions.AI": { @@ -155,7 +157,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.AmbientMetadata.Application": { @@ -296,7 +299,8 @@ "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.5.0", "Microsoft.Extensions.Http": "9.0.5", "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5", - "Microsoft.Extensions.Telemetry": "9.5.0" + "Microsoft.Extensions.Telemetry": "9.5.0", + "System.IO.Pipelines": "9.0.5" } }, "Microsoft.Extensions.Logging": { @@ -498,7 +502,10 @@ "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" + "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==", + "dependencies": { + "System.Reflection.Metadata": "8.0.0" + } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -519,7 +526,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "OpenTelemetry": { @@ -535,7 +543,10 @@ "OpenTelemetry.Api": { "type": "Transitive", "resolved": "1.12.0", - "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==" + "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "9.0.0" + } }, "OpenTelemetry.Api.ProviderBuilderExtensions": { "type": "Transitive", @@ -577,7 +588,10 @@ "SQLitePCLRaw.core": { "type": "Transitive", "resolved": "2.1.10", - "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", + "dependencies": { + "System.Memory": "4.5.3" + } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", @@ -601,6 +615,11 @@ "System.Memory.Data": "8.0.1" } }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", "resolved": "8.0.1", @@ -610,16 +629,39 @@ "Microsoft.IdentityModel.Tokens": "8.0.1" } }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, "System.Memory.Data": { "type": "Transitive", "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", "contentHash": "EzimXy5WX7RJxf1pHBfolBApA4GR7qje1cY9XofD4C+cQepx0a5ZVlZjde8NHk+W1+6kltrbbfa8LIOVpTM6yQ==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, "System.Threading.RateLimiting": { "type": "Transitive", "resolved": "8.0.0", @@ -709,6 +751,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -910,6 +953,12 @@ "requested": "[8.6.0, )", "resolved": "8.4.2", "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" } } } diff --git a/tests/WorkflowFramework.Dashboard.Persistence.Tests/packages.lock.json b/tests/WorkflowFramework.Dashboard.Persistence.Tests/packages.lock.json index 7d66f39..c18d7f3 100644 --- a/tests/WorkflowFramework.Dashboard.Persistence.Tests/packages.lock.json +++ b/tests/WorkflowFramework.Dashboard.Persistence.Tests/packages.lock.json @@ -20,7 +20,8 @@ "Microsoft.Extensions.DependencyModel": "9.0.6", "Microsoft.Extensions.Logging": "9.0.6", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10", - "SQLitePCLRaw.core": "2.1.10" + "SQLitePCLRaw.core": "2.1.10", + "System.Text.Json": "9.0.6" } }, "Microsoft.NET.Test.Sdk": { @@ -128,7 +129,8 @@ "Microsoft.Extensions.Configuration.Abstractions": "9.0.6", "Microsoft.Extensions.DependencyModel": "9.0.6", "Microsoft.Extensions.Logging": "9.0.6", - "SQLitePCLRaw.core": "2.1.10" + "SQLitePCLRaw.core": "2.1.10", + "System.Text.Json": "9.0.6" } }, "Microsoft.Extensions.AI": { @@ -155,7 +157,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.AmbientMetadata.Application": { @@ -296,7 +299,8 @@ "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.5.0", "Microsoft.Extensions.Http": "9.0.5", "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5", - "Microsoft.Extensions.Telemetry": "9.5.0" + "Microsoft.Extensions.Telemetry": "9.5.0", + "System.IO.Pipelines": "9.0.5" } }, "Microsoft.Extensions.Logging": { @@ -498,7 +502,10 @@ "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" + "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==", + "dependencies": { + "System.Reflection.Metadata": "8.0.0" + } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -519,7 +526,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "OpenTelemetry": { @@ -535,7 +543,10 @@ "OpenTelemetry.Api": { "type": "Transitive", "resolved": "1.12.0", - "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==" + "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "9.0.0" + } }, "OpenTelemetry.Api.ProviderBuilderExtensions": { "type": "Transitive", @@ -577,7 +588,10 @@ "SQLitePCLRaw.core": { "type": "Transitive", "resolved": "2.1.10", - "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", + "dependencies": { + "System.Memory": "4.5.3" + } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", @@ -601,6 +615,11 @@ "System.Memory.Data": "8.0.1" } }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", "resolved": "8.0.1", @@ -610,16 +629,39 @@ "Microsoft.IdentityModel.Tokens": "8.0.1" } }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, "System.Memory.Data": { "type": "Transitive", "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", "contentHash": "EzimXy5WX7RJxf1pHBfolBApA4GR7qje1cY9XofD4C+cQepx0a5ZVlZjde8NHk+W1+6kltrbbfa8LIOVpTM6yQ==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, "System.Threading.RateLimiting": { "type": "Transitive", "resolved": "8.0.0", @@ -709,6 +751,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -910,6 +953,12 @@ "requested": "[8.6.0, )", "resolved": "8.4.2", "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" } } } diff --git a/tests/WorkflowFramework.Dashboard.Tests/packages.lock.json b/tests/WorkflowFramework.Dashboard.Tests/packages.lock.json index a3a218c..479a404 100644 --- a/tests/WorkflowFramework.Dashboard.Tests/packages.lock.json +++ b/tests/WorkflowFramework.Dashboard.Tests/packages.lock.json @@ -190,7 +190,8 @@ "Microsoft.Extensions.Configuration.Abstractions": "9.0.6", "Microsoft.Extensions.DependencyModel": "9.0.6", "Microsoft.Extensions.Logging": "9.0.6", - "SQLitePCLRaw.core": "2.1.10" + "SQLitePCLRaw.core": "2.1.10", + "System.Text.Json": "9.0.6" } }, "Microsoft.Extensions.AI": { @@ -217,7 +218,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.AmbientMetadata.Application": { @@ -358,7 +360,8 @@ "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.5.0", "Microsoft.Extensions.Http": "9.0.5", "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5", - "Microsoft.Extensions.Telemetry": "9.5.0" + "Microsoft.Extensions.Telemetry": "9.5.0", + "System.IO.Pipelines": "9.0.5" } }, "Microsoft.Extensions.Logging": { @@ -560,7 +563,10 @@ "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" + "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==", + "dependencies": { + "System.Reflection.Metadata": "8.0.0" + } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -581,7 +587,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "OpenTelemetry": { @@ -597,7 +604,10 @@ "OpenTelemetry.Api": { "type": "Transitive", "resolved": "1.12.0", - "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==" + "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "9.0.0" + } }, "OpenTelemetry.Api.ProviderBuilderExtensions": { "type": "Transitive", @@ -639,7 +649,10 @@ "SQLitePCLRaw.core": { "type": "Transitive", "resolved": "2.1.10", - "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", + "dependencies": { + "System.Memory": "4.5.3" + } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", @@ -663,6 +676,11 @@ "System.Memory.Data": "8.0.1" } }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, "System.Diagnostics.EventLog": { "type": "Transitive", "resolved": "6.0.0", @@ -677,16 +695,39 @@ "Microsoft.IdentityModel.Tokens": "8.0.1" } }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, "System.Memory.Data": { "type": "Transitive", "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", "contentHash": "EzimXy5WX7RJxf1pHBfolBApA4GR7qje1cY9XofD4C+cQepx0a5ZVlZjde8NHk+W1+6kltrbbfa8LIOVpTM6yQ==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, "System.Threading.RateLimiting": { "type": "Transitive", "resolved": "8.0.0", @@ -790,6 +831,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -805,6 +847,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -881,7 +924,8 @@ "Microsoft.Extensions.DependencyModel": "9.0.6", "Microsoft.Extensions.Logging": "9.0.6", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10", - "SQLitePCLRaw.core": "2.1.10" + "SQLitePCLRaw.core": "2.1.10", + "System.Text.Json": "9.0.6" } }, "Microsoft.Extensions.DependencyInjection": { @@ -1023,6 +1067,18 @@ "requested": "[8.6.0, )", "resolved": "8.4.2", "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.0", + "contentHash": "1Dpjwq9peG/Wt5BNbrzIhTpclfOSqBWZsUO28vVr59yQlkvL5jLBWfpfzRmJ1OY+6DciaY0DUcltyzs4fuZHjw==" } }, "net8.0": { diff --git a/tests/WorkflowFramework.Dashboard.UITests/Features/PropertiesPanel.feature.cs b/tests/WorkflowFramework.Dashboard.UITests/Features/PropertiesPanel.feature.cs index ea1d71c..324c323 100644 --- a/tests/WorkflowFramework.Dashboard.UITests/Features/PropertiesPanel.feature.cs +++ b/tests/WorkflowFramework.Dashboard.UITests/Features/PropertiesPanel.feature.cs @@ -107,216 +107,216 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo, globa private static global::Io.Cucumber.Messages.Types.Source SourceFunc() { - return new global::Io.Cucumber.Messages.Types.Source("Features/PropertiesPanel.feature", "@UI\r\nFeature: Properties Panel\r\n Step properties show appropriate controls based" + - " on step type\r\n\r\n Scenario: Action step shows expression field\r\n Given the d" + - "ashboard is running\r\n And I have a workflow with an Action step\r\n When I s" + - "elect the Action step\r\n Then the properties panel should show \"Expression\" fi" + - "eld\r\n And the field should be a text input\r\n\r\n Scenario: LLM step shows prov" + - "ider dropdown and prompt textarea\r\n Given the dashboard is running\r\n And I" + - " have a workflow with a LlmCallStep\r\n When I select the LlmCallStep\r\n Then" + - " the properties panel should show a provider dropdown\r\n And the properties pa" + - "nel should show a model dropdown\r\n And the properties panel should show a pro" + - "mpt textarea\r\n And the properties panel should show a temperature slider\r\n\r\n " + - " Scenario: HTTP step shows method dropdown and URL field\r\n Given the dashboar" + - "d is running\r\n And I have a workflow with an HttpStep\r\n When I select the " + - "HttpStep\r\n Then the properties panel should show a method dropdown with optio" + - "ns \"GET,POST,PUT,DELETE,PATCH\"\r\n And the properties panel should show a URL t" + - "ext field\r\n And the properties panel should show a headers JSON editor\r\n A" + - "nd the properties panel should show a body JSON editor\r\n\r\n Scenario: Human task" + - " step shows priority dropdown\r\n Given the dashboard is running\r\n And I hav" + - "e a workflow with a HumanTaskStep\r\n When I select the HumanTaskStep\r\n Then" + - " the properties panel should show a priority dropdown with options \"Low,Medium,H" + - "igh,Critical\"\r\n And the properties panel should show an assignee field\r\n\r\n S" + - "cenario: Edit step name persists\r\n Given the dashboard is running\r\n And I " + - "have a workflow with an Action step named \"MyStep\"\r\n When I select the Action" + - " step\r\n And I change the step name to \"RenamedStep\"\r\n Then the step name s" + - "hould update on the canvas\r\n\r\n Scenario: Action node inline editor syncs with s" + - "idebar\r\n Given the dashboard is running\r\n And I have a workflow with an Ac" + - "tion step named \"InlineAction\"\r\n When I select the Action step\r\n Then the " + - "action node quick editor should be visible\r\n When I update the inline action " + - "step name to \"InlineRenamed\"\r\n And I update the inline action expression to \"" + - "return transcript.trim();\"\r\n And I save and reopen the current workflow\r\n " + - "Then the properties panel step name should be \"InlineRenamed\"\r\n And the prope" + - "rties panel expression should be \"return transcript.trim();\"\r\n And the action" + - " node summary should contain \"return transcript.trim();\"\r\n\r\n Scenario: Edit not" + - "es persists\r\n Given the dashboard is running\r\n And I have a workflow with " + - "an Action step\r\n When I select the Action step\r\n And I type \"This does imp" + - "ortant work\" in the notes field\r\n Then the notes should be saved\r\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); + return new global::Io.Cucumber.Messages.Types.Source("Features/PropertiesPanel.feature", "@UI\nFeature: Properties Panel\n Step properties show appropriate controls based o" + + "n step type\n\n Scenario: Action step shows expression field\n Given the dashbo" + + "ard is running\n And I have a workflow with an Action step\n When I select t" + + "he Action step\n Then the properties panel should show \"Expression\" field\n " + + "And the field should be a text input\n\n Scenario: LLM step shows provider dropdo" + + "wn and prompt textarea\n Given the dashboard is running\n And I have a workf" + + "low with a LlmCallStep\n When I select the LlmCallStep\n Then the properties" + + " panel should show a provider dropdown\n And the properties panel should show " + + "a model dropdown\n And the properties panel should show a prompt textarea\n " + + "And the properties panel should show a temperature slider\n\n Scenario: HTTP step" + + " shows method dropdown and URL field\n Given the dashboard is running\n And " + + "I have a workflow with an HttpStep\n When I select the HttpStep\n Then the p" + + "roperties panel should show a method dropdown with options \"GET,POST,PUT,DELETE," + + "PATCH\"\n And the properties panel should show a URL text field\n And the pro" + + "perties panel should show a headers JSON editor\n And the properties panel sho" + + "uld show a body JSON editor\n\n Scenario: Human task step shows priority dropdown" + + "\n Given the dashboard is running\n And I have a workflow with a HumanTaskSt" + + "ep\n When I select the HumanTaskStep\n Then the properties panel should show" + + " a priority dropdown with options \"Low,Medium,High,Critical\"\n And the propert" + + "ies panel should show an assignee field\n\n Scenario: Edit step name persists\n " + + " Given the dashboard is running\n And I have a workflow with an Action step na" + + "med \"MyStep\"\n When I select the Action step\n And I change the step name to" + + " \"RenamedStep\"\n Then the step name should update on the canvas\n\n Scenario: A" + + "ction node inline editor syncs with sidebar\n Given the dashboard is running\n " + + " And I have a workflow with an Action step named \"InlineAction\"\n When I sel" + + "ect the Action step\n Then the action node quick editor should be visible\n " + + "When I update the inline action step name to \"InlineRenamed\"\n And I update th" + + "e inline action expression to \"return transcript.trim();\"\n And I save and reo" + + "pen the current workflow\n Then the properties panel step name should be \"Inli" + + "neRenamed\"\n And the properties panel expression should be \"return transcript." + + "trim();\"\n And the action node summary should contain \"return transcript.trim(" + + ");\"\n\n Scenario: Edit notes persists\n Given the dashboard is running\n And " + + "I have a workflow with an Action step\n When I select the Action step\n And " + + "I type \"This does important work\" in the notes field\n Then the notes should b" + + "e saved\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); } private static global::Io.Cucumber.Messages.Types.GherkinDocument GherkinDocumentFunc() { return new global::Io.Cucumber.Messages.Types.GherkinDocument("Features/PropertiesPanel.feature", new global::Io.Cucumber.Messages.Types.Feature(new global::Io.Cucumber.Messages.Types.Location(2, new System.Nullable(1)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "9596ab6e8c47675099a66e2cedbdd97e")}), "en", "Feature", "Properties Panel", " Step properties show appropriate controls based on step type", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "344fba705a16db5d9b7c4ef0512727db")}), "en", "Feature", "Properties Panel", " Step properties show appropriate controls based on step type", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Action step shows expression field", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "a300092987da9d5b82e18e6af1c71ec8"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an Action step", null, null, "55c2bf80513d5459b54e40bca4876714"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the Action step", null, null, "9815d01a1257b75ca6856db3be2eded9"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show \"Expression\" field", null, null, "6dba4e300af41b5286267c2835040949"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the field should be a text input", null, null, "e64dbd530f9cff5599775ab60225d671")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "cdf93107ba6c5a5b9c29ce13c91e4673")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "9e7bce0005dcc25bba49f74175cc5494"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an Action step", null, null, "63d3c6166907425fbce191c19ff962e3"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the Action step", null, null, "1baa35341d0eae51ab2c4a8e48fa4c53"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show \"Expression\" field", null, null, "56ce9a481cba115db4a4828882b3be6f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the field should be a text input", null, null, "fbc483070152a552a172553f6ca6c32c")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "565bc8a6dc17b25eae2ab6ab85daae5f")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(12, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "LLM step shows provider dropdown and prompt textarea", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "243b6627a9454d5f98ab3d94fe4f92e6"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with a LlmCallStep", null, null, "c5dee100e00070518d80c8c2e6c911d1"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the LlmCallStep", null, null, "90e9c1ddad2fbf59b708954184d16884"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show a provider dropdown", null, null, "dec8069c24087e5f8c5f76759527135f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a model dropdown", null, null, "bbd818cb03bde951986b6e5eaf4f7749"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a prompt textarea", null, null, "883beb7d86e0755babfea85e640dbac8"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a temperature slider", null, null, "a62543752ae3e258b0d4c3e702efb3be")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "06de3f7dfd3b3b5cbab0c9edf4ff1051")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "bd8055c6867d555c915b8572a15e9957"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with a LlmCallStep", null, null, "d5e67a9914e7f05bb589b4916d875f53"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the LlmCallStep", null, null, "a862cb81dcf96f5487022315f5812c26"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show a provider dropdown", null, null, "9b022296d837205b90c88930ea21dd3f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a model dropdown", null, null, "4c8e68802faa4559862c38871451c3c6"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a prompt textarea", null, null, "63c44b44995f495d866a30a4ee4c5d11"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a temperature slider", null, null, "a274ea4699b0675aa5a357503cf72eca")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "8491c61cf501795d8f4c36c5f941b916")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "HTTP step shows method dropdown and URL field", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "236cfb392ecc0c54b6860f286d3bafc0"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an HttpStep", null, null, "cb46fea9f6c1ad50be4c01973b5b2f9f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the HttpStep", null, null, "84fcf8f5c594f85a982aa541877359c1"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "f6059d05ef6e2d5481a39910eafb4800"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an HttpStep", null, null, "220d963a61049e5a82d44578dc9c9e7b"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the HttpStep", null, null, "14e83e05c265855e892dbe3e9d11ec7c"), new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show a method dropdown with options \"GET,POST,PUT,DEL" + - "ETE,PATCH\"", null, null, "e2c94e53c59c915484edcf99cb2959e8"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(26, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a URL text field", null, null, "425036e607708c5e85783a5a16e86933"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(27, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a headers JSON editor", null, null, "9cf6fd38275a5a5cb245abe96a9251d0"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a body JSON editor", null, null, "a33ae820c29807539f722945c7ecfdc1")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "b5902bfad9224a5e821fa47fb12f16bf")), + "ETE,PATCH\"", null, null, "5b18451ce6f5ef5bbb6e026e7119fa25"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(26, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a URL text field", null, null, "3dc56888f281495d98e6498e036ac13d"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(27, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a headers JSON editor", null, null, "7ebe4c7a8fdef956a3ebc624f281dfcd"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show a body JSON editor", null, null, "a1deff61c1806c57aacd54de90917074")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "54d56522f980cc55ba11e0e915734855")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Human task step shows priority dropdown", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "105309c05a9ab650a4c846fcd1c718c7"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with a HumanTaskStep", null, null, "4e3f1d19eaf8685cbb137600f1c6913f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the HumanTaskStep", null, null, "8b56e2b57272e15a86b9925d850a884c"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "602319acf7c64c5ab146cd50003d04b0"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with a HumanTaskStep", null, null, "e221ff70f8a8f250802eeed0db385d0d"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the HumanTaskStep", null, null, "cb5e5ce86190a850940cd7cfe5edfb83"), new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(34, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show a priority dropdown with options \"Low,Medium,Hig" + - "h,Critical\"", null, null, "b051f7a620d613529f6a83585c52b1da"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show an assignee field", null, null, "4869bc31c6b53953ac4cf6f126478568")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "409388fa1974db508b424b944249647d")), + "h,Critical\"", null, null, "276c2df6b6138a529f1acab04e461cf1"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel should show an assignee field", null, null, "6cdd9bcdf2f6115dae336ec5bab0ac4d")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "0a47ddaf53d8ce5385eb9f1111d999b9")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(37, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Edit step name persists", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(38, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "92679df9a1fe7e59b1cc3151e11fedcf"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(39, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an Action step named \"MyStep\"", null, null, "7c55c174d308575c8f80be08bb117d6e"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(40, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the Action step", null, null, "28601a817dd6055183d384ee3a032e80"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(41, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I change the step name to \"RenamedStep\"", null, null, "d131b7cd11da5c548df1133652a6304f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(42, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the step name should update on the canvas", null, null, "4759a193fa44455380cc838a65b33e85")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "3052a069fcf25d5b8a852a51399e6677")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(38, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "5cf3e91dc1397651bda486b16131d79e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(39, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an Action step named \"MyStep\"", null, null, "c83ce49e1ca98755ad0ad3cec8f22981"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(40, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the Action step", null, null, "ffc1262066ae4f55b759c8bf2703111c"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(41, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I change the step name to \"RenamedStep\"", null, null, "efc8b0d2ad86c451b84764c26e608e51"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(42, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the step name should update on the canvas", null, null, "bc0c5dcbbd445c51ac3de860cd96f277")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "86c776a8eb181d52ae186fd98ef09dda")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(44, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Action node inline editor syncs with sidebar", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(45, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "b4037648fee17c5a91b0ea6593760198"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(46, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an Action step named \"InlineAction\"", null, null, "66a9e163567afb5288c76f243c59b96c"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(47, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the Action step", null, null, "ce6c44ba88ea0c5b9d8ccfc5788536fb"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(48, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the action node quick editor should be visible", null, null, "b078d61113b5fe5cbe836243cdb14650"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(49, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I update the inline action step name to \"InlineRenamed\"", null, null, "5e110942a5f1485e9b9da0fae9e1b3ee"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(50, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I update the inline action expression to \"return transcript.trim();\"", null, null, "8c78b375b28067599d19d64cd993562d"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(51, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I save and reopen the current workflow", null, null, "097756a3a25ad058bb14a9fe1bad3e4f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(52, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel step name should be \"InlineRenamed\"", null, null, "5ebba2e514b01854bf17cac11aca04a9"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(53, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel expression should be \"return transcript.trim();\"", null, null, "3a9a0878ac9f9850899632fc2a40fa43"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(54, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the action node summary should contain \"return transcript.trim();\"", null, null, "174e19749ed78a548c635ab2b9aaa787")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "0167f87aff57b45098e67efa6ab27bdd")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(45, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "8aa423c57e9eb757b2749ec274bf3355"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(46, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an Action step named \"InlineAction\"", null, null, "9340ddc858dbec53a31ffd8adc6bbd87"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(47, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the Action step", null, null, "6612db64b74a0e569385f6168bb91a9b"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(48, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the action node quick editor should be visible", null, null, "39fd4f6f5f771858ac3db99c9506fede"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(49, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I update the inline action step name to \"InlineRenamed\"", null, null, "a03ad1e0eb17765a8b2373c6d0f0db5e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(50, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I update the inline action expression to \"return transcript.trim();\"", null, null, "d065a40f828bcb58be30393e7175427a"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(51, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I save and reopen the current workflow", null, null, "d47c3d61c8f1f5589107aede50eefc1e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(52, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel step name should be \"InlineRenamed\"", null, null, "00e61b98546a765baf5dff229a2354bd"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(53, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the properties panel expression should be \"return transcript.trim();\"", null, null, "6438db2828318f5cba7edaf85aee27bc"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(54, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the action node summary should contain \"return transcript.trim();\"", null, null, "a6a89c5b4da3ce519f9696e3d108a34c")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "a4b888d755284257a51f2178b79ac1de")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(56, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Edit notes persists", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(57, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "10390480f4362c5db557b187cbe4ef8c"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(58, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an Action step", null, null, "42eb73ed2f0e895aa7ef2eb30d18d122"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(59, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the Action step", null, null, "3eb8c10a6b875a559fa29ea4864875fe"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(60, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I type \"This does important work\" in the notes field", null, null, "ec17ce4f0a14b0588fdeada74b325b4e"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(61, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the notes should be saved", null, null, "8c0ebe6eaf8abd53a4904f911f90f0d5")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "cbdcee7ba5abb45cbeef114af795a1b3"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(57, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "d77736f69d7872508bf3273ef570f665"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(58, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an Action step", null, null, "5265875cb2df6851aea6f71eee5f0435"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(59, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the Action step", null, null, "2c6bb301ae069653bdb64c2e6d0fa89b"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(60, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I type \"This does important work\" in the notes field", null, null, "8b6989777cafd0569eb35b288ba7b368"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(61, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the notes should be saved", null, null, "4f3cba3b2b1ef9508bd1a0d45e0475c1")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "f61e5dfb324b3058a36a29874b04d5d6"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); } private static global::System.Collections.Generic.IEnumerable PicklesFunc() { return new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Pickle[] { - new global::Io.Cucumber.Messages.Types.Pickle("6972ea923c7da059adb8e1bb86c35ad9", "Features/PropertiesPanel.feature", "Action step shows expression field", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + new global::Io.Cucumber.Messages.Types.Pickle("19b2089e90af925bb8ac0de9f6f39160", "Features/PropertiesPanel.feature", "Action step shows expression field", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a300092987da9d5b82e18e6af1c71ec8"}), "21c00e3d6fb64652ba262aa1996a1edb", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "9e7bce0005dcc25bba49f74175cc5494"}), "5a6397af9a063557a04a5ebeafbe156d", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "55c2bf80513d5459b54e40bca4876714"}), "af15dacab52dcd57b794a839ed36ea90", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an Action step"), + "63d3c6166907425fbce191c19ff962e3"}), "426d8d1f33a4a85eb2eeb0940cd307f9", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an Action step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "9815d01a1257b75ca6856db3be2eded9"}), "d1b0494a7edcf85daf42f47aa1b607ea", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the Action step"), + "1baa35341d0eae51ab2c4a8e48fa4c53"}), "34430eca29841f5e88bdb3a696f1e6f3", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the Action step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "6dba4e300af41b5286267c2835040949"}), "68496c6c25a7825281343786b8156c41", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show \"Expression\" field"), + "56ce9a481cba115db4a4828882b3be6f"}), "ebf8ea3b442ef355b25f822ab84da4cd", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show \"Expression\" field"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e64dbd530f9cff5599775ab60225d671"}), "8f53d7d76afcef53acb5fd55ff5ea485", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the field should be a text input")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9596ab6e8c47675099a66e2cedbdd97e")}), new System.Collections.Generic.List(new string[] { - "cdf93107ba6c5a5b9c29ce13c91e4673"})), - new global::Io.Cucumber.Messages.Types.Pickle("747ebcc358c56457a38fba8c1ffdd7de", "Features/PropertiesPanel.feature", "LLM step shows provider dropdown and prompt textarea", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "fbc483070152a552a172553f6ca6c32c"}), "71f160b45df95e5d9629d1fed6100140", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the field should be a text input")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "344fba705a16db5d9b7c4ef0512727db")}), new System.Collections.Generic.List(new string[] { + "565bc8a6dc17b25eae2ab6ab85daae5f"})), + new global::Io.Cucumber.Messages.Types.Pickle("a83a356349b3835485b61609b18baf17", "Features/PropertiesPanel.feature", "LLM step shows provider dropdown and prompt textarea", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "243b6627a9454d5f98ab3d94fe4f92e6"}), "4fe5bffe73d9885fa380a4c094e2a45f", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "bd8055c6867d555c915b8572a15e9957"}), "e0ddf282673ff95da1ec93528e513adf", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "c5dee100e00070518d80c8c2e6c911d1"}), "84187abab8ee175db99d58537cb54b98", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with a LlmCallStep"), + "d5e67a9914e7f05bb589b4916d875f53"}), "aa20ab668be1b35a99db300cf37aa1f2", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with a LlmCallStep"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "90e9c1ddad2fbf59b708954184d16884"}), "b567124a08c94e5ca081edf0153dc497", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the LlmCallStep"), + "a862cb81dcf96f5487022315f5812c26"}), "02148fc1fd5de35185a8c3acc87fbaa8", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the LlmCallStep"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "dec8069c24087e5f8c5f76759527135f"}), "bba0b16798946f56a40aa42e0518b0cb", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a provider dropdown"), + "9b022296d837205b90c88930ea21dd3f"}), "fefc10d475c1b253b6825c11b031caec", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a provider dropdown"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "bbd818cb03bde951986b6e5eaf4f7749"}), "39045bb4d3c83b5e802f185b6c2716f9", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a model dropdown"), + "4c8e68802faa4559862c38871451c3c6"}), "9d12716d9e177e5796ba8848fef9ee9a", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a model dropdown"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "883beb7d86e0755babfea85e640dbac8"}), "55ad6dab83d4575c82258fe25fe32dd3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a prompt textarea"), + "63c44b44995f495d866a30a4ee4c5d11"}), "d8adf26aae83d95bb51430a731c3649b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a prompt textarea"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a62543752ae3e258b0d4c3e702efb3be"}), "0f0f3385cd36fa5098b73c52649daec7", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a temperature slider")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9596ab6e8c47675099a66e2cedbdd97e")}), new System.Collections.Generic.List(new string[] { - "06de3f7dfd3b3b5cbab0c9edf4ff1051"})), - new global::Io.Cucumber.Messages.Types.Pickle("00068241bc32405cb738bc4b254687f8", "Features/PropertiesPanel.feature", "HTTP step shows method dropdown and URL field", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "a274ea4699b0675aa5a357503cf72eca"}), "9913ec3a1c44f15aaf5518ebd4e8f001", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a temperature slider")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "344fba705a16db5d9b7c4ef0512727db")}), new System.Collections.Generic.List(new string[] { + "8491c61cf501795d8f4c36c5f941b916"})), + new global::Io.Cucumber.Messages.Types.Pickle("d54a73e05a2496559546c0cf0c0bff55", "Features/PropertiesPanel.feature", "HTTP step shows method dropdown and URL field", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "236cfb392ecc0c54b6860f286d3bafc0"}), "f1d75d296c9df658a0eb3e6d339b80d4", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "f6059d05ef6e2d5481a39910eafb4800"}), "19ebe4bb965c2851a9fe1b3631ce352a", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "cb46fea9f6c1ad50be4c01973b5b2f9f"}), "30815e27fa45b35381d12c7ea1c0103a", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an HttpStep"), + "220d963a61049e5a82d44578dc9c9e7b"}), "86600e6721c8f45180df6ce98bc17dd3", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an HttpStep"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "84fcf8f5c594f85a982aa541877359c1"}), "48cede607eb7715795140341c4d76d1b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the HttpStep"), + "14e83e05c265855e892dbe3e9d11ec7c"}), "68bb865e40d26e56a2650f321d502bfb", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the HttpStep"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e2c94e53c59c915484edcf99cb2959e8"}), "d4ec228bc432b459b3723f01b4b2d52c", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a method dropdown with options \"GET,POST,PUT,DEL" + + "5b18451ce6f5ef5bbb6e026e7119fa25"}), "1f5eac7cfa946b5bb6c42fce920f565d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a method dropdown with options \"GET,POST,PUT,DEL" + "ETE,PATCH\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "425036e607708c5e85783a5a16e86933"}), "0b6ce2ba1cb44054bdcf432046a21507", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a URL text field"), + "3dc56888f281495d98e6498e036ac13d"}), "4d4882e77069405fb12b0f034cf900b2", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a URL text field"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "9cf6fd38275a5a5cb245abe96a9251d0"}), "77ff59b9d12f8059ae9f604ea391bbcd", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a headers JSON editor"), + "7ebe4c7a8fdef956a3ebc624f281dfcd"}), "b2a9819ebcc03a508698e0bb88692e5b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a headers JSON editor"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a33ae820c29807539f722945c7ecfdc1"}), "06c609a87fca9f5ab4bb1b51e72a8c3b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a body JSON editor")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9596ab6e8c47675099a66e2cedbdd97e")}), new System.Collections.Generic.List(new string[] { - "b5902bfad9224a5e821fa47fb12f16bf"})), - new global::Io.Cucumber.Messages.Types.Pickle("5ed9bc8832f6615b81e1c9736efc352e", "Features/PropertiesPanel.feature", "Human task step shows priority dropdown", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "a1deff61c1806c57aacd54de90917074"}), "686aba03f0e75954a304b0a283904236", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a body JSON editor")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "344fba705a16db5d9b7c4ef0512727db")}), new System.Collections.Generic.List(new string[] { + "54d56522f980cc55ba11e0e915734855"})), + new global::Io.Cucumber.Messages.Types.Pickle("8d9119f11195555a965b23932ab013fd", "Features/PropertiesPanel.feature", "Human task step shows priority dropdown", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "105309c05a9ab650a4c846fcd1c718c7"}), "42e345ef223d6455b1b4269adeda31e4", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "602319acf7c64c5ab146cd50003d04b0"}), "b2f3914265263657bfb3e707618d2eef", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4e3f1d19eaf8685cbb137600f1c6913f"}), "f580098efbe0835bb424b024433ef842", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with a HumanTaskStep"), + "e221ff70f8a8f250802eeed0db385d0d"}), "7d870fdba779185eb73930a02545171c", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with a HumanTaskStep"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "8b56e2b57272e15a86b9925d850a884c"}), "bf4f15a60926d757a2aae4794ffef06a", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the HumanTaskStep"), + "cb5e5ce86190a850940cd7cfe5edfb83"}), "8f6607e69fd24b54ae4ebf76aaf21579", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the HumanTaskStep"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "b051f7a620d613529f6a83585c52b1da"}), "93fb9ea57e948650a1bfd0d7836d8a70", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a priority dropdown with options \"Low,Medium,Hig" + + "276c2df6b6138a529f1acab04e461cf1"}), "4dba8523ed89005d9bca5fb1e703d1a4", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show a priority dropdown with options \"Low,Medium,Hig" + "h,Critical\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4869bc31c6b53953ac4cf6f126478568"}), "920926dc9efe245b99962afd255ce903", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show an assignee field")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9596ab6e8c47675099a66e2cedbdd97e")}), new System.Collections.Generic.List(new string[] { - "409388fa1974db508b424b944249647d"})), - new global::Io.Cucumber.Messages.Types.Pickle("51c18e404ad28f5fa3d5d0d9a25d0ff4", "Features/PropertiesPanel.feature", "Edit step name persists", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "6cdd9bcdf2f6115dae336ec5bab0ac4d"}), "07458da5a57f1553a2e933889ecc3d07", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show an assignee field")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "344fba705a16db5d9b7c4ef0512727db")}), new System.Collections.Generic.List(new string[] { + "0a47ddaf53d8ce5385eb9f1111d999b9"})), + new global::Io.Cucumber.Messages.Types.Pickle("ff44637540e83d50ba180dc1bfffe4fc", "Features/PropertiesPanel.feature", "Edit step name persists", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "92679df9a1fe7e59b1cc3151e11fedcf"}), "4467fbdbc77f0d5d8c072ad3abb68d9f", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "5cf3e91dc1397651bda486b16131d79e"}), "f672ddad6ac9f358a3c6b5c18b657380", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7c55c174d308575c8f80be08bb117d6e"}), "66b2375338e15353b7dc75c2da12f4a5", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an Action step named \"MyStep\""), + "c83ce49e1ca98755ad0ad3cec8f22981"}), "5d922c9dc63c2e59bb8c0e3cb577421e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an Action step named \"MyStep\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "28601a817dd6055183d384ee3a032e80"}), "89caeaab3979c75e8e0f19a108dafd35", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the Action step"), + "ffc1262066ae4f55b759c8bf2703111c"}), "38b3ddf2c066005a90d0d8487e0c5f6d", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the Action step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "d131b7cd11da5c548df1133652a6304f"}), "ea8abe3fb880ba538b6ba3b688385e27", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I change the step name to \"RenamedStep\""), + "efc8b0d2ad86c451b84764c26e608e51"}), "cff7d6abf8667456b817206ec358d97b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I change the step name to \"RenamedStep\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4759a193fa44455380cc838a65b33e85"}), "0925cdd3d696c854a0f2875fc9ce99df", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the step name should update on the canvas")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9596ab6e8c47675099a66e2cedbdd97e")}), new System.Collections.Generic.List(new string[] { - "3052a069fcf25d5b8a852a51399e6677"})), - new global::Io.Cucumber.Messages.Types.Pickle("e1731c0633b9805e8760ba6ad292fc1f", "Features/PropertiesPanel.feature", "Action node inline editor syncs with sidebar", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "bc0c5dcbbd445c51ac3de860cd96f277"}), "d2a2726d7a40285ea1a16874b8e1c48b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the step name should update on the canvas")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "344fba705a16db5d9b7c4ef0512727db")}), new System.Collections.Generic.List(new string[] { + "86c776a8eb181d52ae186fd98ef09dda"})), + new global::Io.Cucumber.Messages.Types.Pickle("da2cb510d19101569e295641ac07b39a", "Features/PropertiesPanel.feature", "Action node inline editor syncs with sidebar", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "b4037648fee17c5a91b0ea6593760198"}), "880788c8b95c2051b16b0b54d139a279", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "8aa423c57e9eb757b2749ec274bf3355"}), "4fb669cc7a56835b89de8d9db218400b", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "66a9e163567afb5288c76f243c59b96c"}), "675c9199f3db505fb95104f470062e1f", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an Action step named \"InlineAction\""), + "9340ddc858dbec53a31ffd8adc6bbd87"}), "ad29d7813032765cafa9264dca186cdf", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an Action step named \"InlineAction\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ce6c44ba88ea0c5b9d8ccfc5788536fb"}), "470d77d57989b55a940bd275a5aeb8bc", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the Action step"), + "6612db64b74a0e569385f6168bb91a9b"}), "96358870abe72250a1569904deb9c6ad", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the Action step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "b078d61113b5fe5cbe836243cdb14650"}), "ca8622abacd2a658be2da8b812bf4207", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the action node quick editor should be visible"), + "39fd4f6f5f771858ac3db99c9506fede"}), "23879ca6f764965cb2192f65ce561a7e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the action node quick editor should be visible"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "5e110942a5f1485e9b9da0fae9e1b3ee"}), "e66886a159649850a7c53a9fd9ef321f", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I update the inline action step name to \"InlineRenamed\""), + "a03ad1e0eb17765a8b2373c6d0f0db5e"}), "4cc8547224a980549d1789696cd58556", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I update the inline action step name to \"InlineRenamed\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "8c78b375b28067599d19d64cd993562d"}), "3149c950b8bcfa5093efbc5d3426cddf", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I update the inline action expression to \"return transcript.trim();\""), + "d065a40f828bcb58be30393e7175427a"}), "5a39065e21fc215f8afae9312357aad8", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I update the inline action expression to \"return transcript.trim();\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "097756a3a25ad058bb14a9fe1bad3e4f"}), "89575be78d663352ad59ba4078ec129d", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and reopen the current workflow"), + "d47c3d61c8f1f5589107aede50eefc1e"}), "99c7641abab5b65fab816a771352d5e2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and reopen the current workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "5ebba2e514b01854bf17cac11aca04a9"}), "d4a5fd401634495ebff69b1e7b1586f3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel step name should be \"InlineRenamed\""), + "00e61b98546a765baf5dff229a2354bd"}), "5f12e2072f59a35dae584dd80451758c", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel step name should be \"InlineRenamed\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3a9a0878ac9f9850899632fc2a40fa43"}), "1e276a07a7e7e655a655130309ccaf14", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel expression should be \"return transcript.trim();\""), + "6438db2828318f5cba7edaf85aee27bc"}), "8e413d946e2654598bd32e6ea51a5a07", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel expression should be \"return transcript.trim();\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "174e19749ed78a548c635ab2b9aaa787"}), "74c55576020f145285187939a30073bc", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the action node summary should contain \"return transcript.trim();\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9596ab6e8c47675099a66e2cedbdd97e")}), new System.Collections.Generic.List(new string[] { - "0167f87aff57b45098e67efa6ab27bdd"})), - new global::Io.Cucumber.Messages.Types.Pickle("c33449aa45491f50bb14891ca0daf554", "Features/PropertiesPanel.feature", "Edit notes persists", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "a6a89c5b4da3ce519f9696e3d108a34c"}), "fb0cf35b515ea750bdc73adb7faa2b02", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the action node summary should contain \"return transcript.trim();\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "344fba705a16db5d9b7c4ef0512727db")}), new System.Collections.Generic.List(new string[] { + "a4b888d755284257a51f2178b79ac1de"})), + new global::Io.Cucumber.Messages.Types.Pickle("029cbb08f6d1a452a27b13d643c267ba", "Features/PropertiesPanel.feature", "Edit notes persists", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "10390480f4362c5db557b187cbe4ef8c"}), "5120052df0946a51b7a83ef88c4edb54", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "d77736f69d7872508bf3273ef570f665"}), "b797228a6321fe59a85ba476c7937c82", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "42eb73ed2f0e895aa7ef2eb30d18d122"}), "b34dc7cd5e61f456a74025b16700f8e3", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an Action step"), + "5265875cb2df6851aea6f71eee5f0435"}), "9e0d41cf6445495ab8b62766f70ee139", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an Action step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3eb8c10a6b875a559fa29ea4864875fe"}), "a1f4fdc668ac23529069fb0f24f8d1b5", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the Action step"), + "2c6bb301ae069653bdb64c2e6d0fa89b"}), "bbdc60f7b72f605bb87844112f20d860", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the Action step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ec17ce4f0a14b0588fdeada74b325b4e"}), "9f40e8dbc8b8f75a85e1236a6ebdce59", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I type \"This does important work\" in the notes field"), + "8b6989777cafd0569eb35b288ba7b368"}), "cb42a6a78b86ef59a518bc94a458fda2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I type \"This does important work\" in the notes field"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "8c0ebe6eaf8abd53a4904f911f90f0d5"}), "3992c059bb57c15fbfa009fd2d3fa43b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the notes should be saved")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9596ab6e8c47675099a66e2cedbdd97e")}), new System.Collections.Generic.List(new string[] { - "cbdcee7ba5abb45cbeef114af795a1b3"}))}); + "4f3cba3b2b1ef9508bd1a0d45e0475c1"}), "7bb6b96a5bfa1c598846dbbafd111a5e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the notes should be saved")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "344fba705a16db5d9b7c4ef0512727db")}), new System.Collections.Generic.List(new string[] { + "f61e5dfb324b3058a36a29874b04d5d6"}))}); } private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() diff --git a/tests/WorkflowFramework.Dashboard.UITests/Features/RunAssistant.feature.cs b/tests/WorkflowFramework.Dashboard.UITests/Features/RunAssistant.feature.cs index 05f2565..a3642b9 100644 --- a/tests/WorkflowFramework.Dashboard.UITests/Features/RunAssistant.feature.cs +++ b/tests/WorkflowFramework.Dashboard.UITests/Features/RunAssistant.feature.cs @@ -108,134 +108,133 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo, globa private static global::Io.Cucumber.Messages.Types.Source SourceFunc() { - return new global::Io.Cucumber.Messages.Types.Source("Features/RunAssistant.feature", "@UI\r\nFeature: Run Assistant\r\n Audio workflows should provide interactive recordi" + - "ng UX and stay free of interop exceptions\r\n\r\n Scenario: Blog Interview workflow" + - " opens guided recording tasks\r\n Given the browser voice recorder is mocked\r\n " + - " And the dashboard is running\r\n And I open the \"Blog Interview\" sample work" + - "flow\r\n When I run the workflow\r\n Then the run assistant should open with r" + - "ecording controls\r\n And the run assistant should expose multiple interactive " + - "tasks\r\n And the browser should not report run assistant interop errors\r\n\r\n S" + - "cenario: Record audio in run assistant for Quick Transcript workflow\r\n Given " + - "the browser voice recorder is mocked\r\n And the dashboard is running\r\n And " + - "I open the \"Quick Transcript\" sample workflow\r\n When I run the workflow\r\n " + - "Then the run assistant should open with recording controls\r\n When I start rec" + - "ording in the run assistant\r\n And I stop recording in the run assistant\r\n " + - "Then the run assistant should show captured audio\r\n When I complete the run a" + - "ssistant flow and start the workflow\r\n Then the output feed should show detai" + - "led execution telemetry\r\n And the browser should not report run assistant int" + - "erop errors\r\n\r\n Scenario: Run assistant recovers when stopping recording fails\r" + - "\n Given the browser voice recorder stop fails after transcription halts\r\n " + - "And the dashboard is running\r\n And I open the \"Quick Transcript\" sample workf" + - "low\r\n When I run the workflow\r\n Then the run assistant should open with re" + - "cording controls\r\n When I start recording in the run assistant\r\n And stopp" + - "ing recording fails in the run assistant\r\n Then the run assistant should rese" + - "t recording controls after a stop failure\r\n And the browser should not report" + - " run assistant interop errors\r\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); + return new global::Io.Cucumber.Messages.Types.Source("Features/RunAssistant.feature", "@UI\nFeature: Run Assistant\n Audio workflows should provide interactive recording" + + " UX and stay free of interop exceptions\n\n Scenario: Blog Interview workflow ope" + + "ns guided recording tasks\n Given the browser voice recorder is mocked\n And" + + " the dashboard is running\n And I open the \"Blog Interview\" sample workflow\n " + + " When I run the workflow\n Then the run assistant should open with recording " + + "controls\n And the run assistant should expose multiple interactive tasks\n " + + "And the browser should not report run assistant interop errors\n\n Scenario: Reco" + + "rd audio in run assistant for Quick Transcript workflow\n Given the browser vo" + + "ice recorder is mocked\n And the dashboard is running\n And I open the \"Quic" + + "k Transcript\" sample workflow\n When I run the workflow\n Then the run assis" + + "tant should open with recording controls\n When I start recording in the run a" + + "ssistant\n And I stop recording in the run assistant\n Then the run assistan" + + "t should show captured audio\n When I complete the run assistant flow and star" + + "t the workflow\n Then the output feed should show detailed execution telemetry" + + "\n And the browser should not report run assistant interop errors\n\n Scenario:" + + " Run assistant recovers when stopping recording fails\n Given the browser voic" + + "e recorder stop fails after transcription halts\n And the dashboard is running" + + "\n And I open the \"Quick Transcript\" sample workflow\n When I run the workfl" + + "ow\n Then the run assistant should open with recording controls\n When I sta" + + "rt recording in the run assistant\n And stopping recording fails in the run as" + + "sistant\n Then the run assistant should reset recording controls after a stop " + + "failure\n And the browser should not report run assistant interop errors\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); } private static global::Io.Cucumber.Messages.Types.GherkinDocument GherkinDocumentFunc() { return new global::Io.Cucumber.Messages.Types.GherkinDocument("Features/RunAssistant.feature", new global::Io.Cucumber.Messages.Types.Feature(new global::Io.Cucumber.Messages.Types.Location(2, new System.Nullable(1)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "2bd853a50ad8e65facd10eaa9a3050ef")}), "en", "Feature", "Run Assistant", " Audio workflows should provide interactive recording UX and stay free of intero" + + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "4358eba403bf9d5a88e2991d960afce7")}), "en", "Feature", "Run Assistant", " Audio workflows should provide interactive recording UX and stay free of intero" + "p exceptions", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Blog Interview workflow opens guided recording tasks", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the browser voice recorder is mocked", null, null, "d0d6825ec39b5156aabf306809cfda37"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the dashboard is running", null, null, "5dcd0cfb17b5b057bcbdc1163d8bbe19"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Blog Interview\" sample workflow", null, null, "78b25ef69820605691708d5771f43a10"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I run the workflow", null, null, "3a7e05cf6a4b5d5c83b23b1941629afe"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should open with recording controls", null, null, "0e376378dd76945db643a62115685277"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run assistant should expose multiple interactive tasks", null, null, "7c8be190ddd4405f9f762810c9974cbe"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(12, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the browser should not report run assistant interop errors", null, null, "b694fac46ce1405f9e0d95229ad212cc")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "31933ec86090f45abf4e3b1702dc23d4")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the browser voice recorder is mocked", null, null, "d62aa228d7997951a15ff9274b7713fd"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the dashboard is running", null, null, "773a10631667dd57a60dc22ec7df26fa"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Blog Interview\" sample workflow", null, null, "d40ea23f8205b15ab3e35e980cf0a08c"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I run the workflow", null, null, "9a6ddedd2f37125b8a432d0e75c526c9"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should open with recording controls", null, null, "52b92355f9185f56bf942f60f4c23622"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run assistant should expose multiple interactive tasks", null, null, "5fb9c706ba95945dbaa9d51c68f32a90"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(12, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the browser should not report run assistant interop errors", null, null, "7bf5b821ae9bcb5b8c7a9be90de3b9bb")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "bc70882ce67f035482dc06e4e41bc9c3")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Record audio in run assistant for Quick Transcript workflow", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the browser voice recorder is mocked", null, null, "579e4219670c0d578a2272d044526079"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the dashboard is running", null, null, "5ab82dffd07d5056b662dc982476775a"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Quick Transcript\" sample workflow", null, null, "217065ce25b48057b2bfbb3397e864f4"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I run the workflow", null, null, "d091d09e6e2c99599fd69b58804eaa87"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should open with recording controls", null, null, "a3e34632d7fdd35484a1255d83760e98"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I start recording in the run assistant", null, null, "bd2873d6de57af53b190b3a3c5d70138"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I stop recording in the run assistant", null, null, "e105d5fe019d615db9073b07a6a38b64"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should show captured audio", null, null, "92fc879d403425588bde6cb8f5c1df5b"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I complete the run assistant flow and start the workflow", null, null, "9ef988855c5b7750908f442bfd2ad8d7"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the output feed should show detailed execution telemetry", null, null, "0482cd69f0834455b6539eefd5785cf8"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the browser should not report run assistant interop errors", null, null, "e0f6d88cd393db5e937e86dd479f9474")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "eb71df5e6266b35c8b4d98958ff078d8")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the browser voice recorder is mocked", null, null, "8f8aeb7c5353c459b155ea6422a1917f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the dashboard is running", null, null, "4cad37f999341e5dbff4ed54e3231c93"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Quick Transcript\" sample workflow", null, null, "90a64c7092ea735f9791e3f476d3be92"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I run the workflow", null, null, "d7259a7bba691351aecfa9ab3bbd9103"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should open with recording controls", null, null, "a417c3b80203a35c8680ff91a3ee9c44"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I start recording in the run assistant", null, null, "6224c8c8ebb0f952ac4b5739cff812da"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I stop recording in the run assistant", null, null, "94038edcbc021e538bf0aee8e4c4f216"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should show captured audio", null, null, "ac0bebe5842a2a5692a1753a5d6a0d55"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I complete the run assistant flow and start the workflow", null, null, "af3500a571486b5e8fbe3fcdb81e49d9"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the output feed should show detailed execution telemetry", null, null, "1f644f58818e9054bbf434dec8fc032a"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the browser should not report run assistant interop errors", null, null, "21c751f29bb78e5f9368f564374bbcb8")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "1176a38a28805555a8b07342c847ced9")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(27, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Run assistant recovers when stopping recording fails", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the browser voice recorder stop fails after transcription halts", null, null, "85e12744cb984357b9b7e57d8498105a"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(29, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the dashboard is running", null, null, "50e901e144c9b454886a04678c2c0974"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Quick Transcript\" sample workflow", null, null, "20dca46b7dedbc549246f20a370e41a0"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I run the workflow", null, null, "4252a7514095fd58a2f7e395517b80ad"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should open with recording controls", null, null, "4442b9c464248b5c950ca6f78e47f9b3"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I start recording in the run assistant", null, null, "1b9ce1c18651df5ab8ed00ab6d496370"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(34, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "stopping recording fails in the run assistant", null, null, "ec51ac4f3bac025794ac26c1932feb2b"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should reset recording controls after a stop failure", null, null, "5c5f565c1d852b5686cd084caa0e66a8"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the browser should not report run assistant interop errors", null, null, "62fcf672eecbbb5facce4b73ed2996f7")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "042f870b0e5c2e548a7e055a9a99f921"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the browser voice recorder stop fails after transcription halts", null, null, "5fcdccff5371cf50b41d8394816a6f6b"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(29, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the dashboard is running", null, null, "07d86a9fda6bfb559c49d1d10649e63f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Quick Transcript\" sample workflow", null, null, "f37b3d1e4f4d3652be38cdb0341167e1"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I run the workflow", null, null, "29ee9af5a7c3ab5fb1a5522655f699f3"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should open with recording controls", null, null, "3aed1f8c6883a054b1688c4c0f0d0ab1"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I start recording in the run assistant", null, null, "3c153b056ad71252bcfc6e522f8a17f8"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(34, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "stopping recording fails in the run assistant", null, null, "e1cc2cbdeecfaf5d874ec72ebe36df75"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run assistant should reset recording controls after a stop failure", null, null, "46d218c082801b5d88ad587bd6c8ac99"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the browser should not report run assistant interop errors", null, null, "a0f1ba4da80893538a0f477dc5b904dc")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "315704f33f56975e991d5a07ae666867"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); } private static global::System.Collections.Generic.IEnumerable PicklesFunc() { return new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Pickle[] { - new global::Io.Cucumber.Messages.Types.Pickle("27bb833d1916565a8085a3d2b1ba20cf", "Features/RunAssistant.feature", "Blog Interview workflow opens guided recording tasks", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + new global::Io.Cucumber.Messages.Types.Pickle("45428d2110e41f55adaf3c6d16355ee0", "Features/RunAssistant.feature", "Blog Interview workflow opens guided recording tasks", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "d0d6825ec39b5156aabf306809cfda37"}), "299786d07c354559acff8dae9d365853", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the browser voice recorder is mocked"), + "d62aa228d7997951a15ff9274b7713fd"}), "9e4c6a7a3aa4b75285010189005273d0", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the browser voice recorder is mocked"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "5dcd0cfb17b5b057bcbdc1163d8bbe19"}), "7ca44048ae79995f85fc4e70306b758a", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "773a10631667dd57a60dc22ec7df26fa"}), "6ca789dbfa238f509edae57280870fda", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "78b25ef69820605691708d5771f43a10"}), "8c9296a334f15c5b86d4533307397224", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Blog Interview\" sample workflow"), + "d40ea23f8205b15ab3e35e980cf0a08c"}), "6f5f6b427ef49a5ab3125cebd22995f6", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Blog Interview\" sample workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3a7e05cf6a4b5d5c83b23b1941629afe"}), "0b73ebc362b4d25a8bd317e242822e84", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I run the workflow"), + "9a6ddedd2f37125b8a432d0e75c526c9"}), "8a0957f8508ed45db4381f650f1757a2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "0e376378dd76945db643a62115685277"}), "bf05f0ff7094fe5f8545d24f60784753", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should open with recording controls"), + "52b92355f9185f56bf942f60f4c23622"}), "35fa1dfa054dea52bc2c1ae599954843", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should open with recording controls"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7c8be190ddd4405f9f762810c9974cbe"}), "14ade06ded7d6f5582cf5ffe6f3cf0d3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should expose multiple interactive tasks"), + "5fb9c706ba95945dbaa9d51c68f32a90"}), "d3a70483fcf232519b2681b49d6f02c7", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should expose multiple interactive tasks"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "b694fac46ce1405f9e0d95229ad212cc"}), "1a193cdcaaf722589e03ca83a4884fc6", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the browser should not report run assistant interop errors")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "2bd853a50ad8e65facd10eaa9a3050ef")}), new System.Collections.Generic.List(new string[] { - "31933ec86090f45abf4e3b1702dc23d4"})), - new global::Io.Cucumber.Messages.Types.Pickle("7dce659ab7dfc251826d3f75c7864a44", "Features/RunAssistant.feature", "Record audio in run assistant for Quick Transcript workflow", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "7bf5b821ae9bcb5b8c7a9be90de3b9bb"}), "a71cf2a42c7ef65991a32ade5a16571e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the browser should not report run assistant interop errors")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4358eba403bf9d5a88e2991d960afce7")}), new System.Collections.Generic.List(new string[] { + "bc70882ce67f035482dc06e4e41bc9c3"})), + new global::Io.Cucumber.Messages.Types.Pickle("88bde9c25c2c9058ba3d83def95697d6", "Features/RunAssistant.feature", "Record audio in run assistant for Quick Transcript workflow", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "579e4219670c0d578a2272d044526079"}), "7d87a3f045767d5ebae33e51a318ae15", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the browser voice recorder is mocked"), + "8f8aeb7c5353c459b155ea6422a1917f"}), "03c3a8fa4cc6985f8c0d8098264627a0", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the browser voice recorder is mocked"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "5ab82dffd07d5056b662dc982476775a"}), "6d03ddf9f7f0715fbae2c882bb223ac0", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "4cad37f999341e5dbff4ed54e3231c93"}), "daf7e7bd44bc3a52ac47a017d8212906", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "217065ce25b48057b2bfbb3397e864f4"}), "9f19d62604ea895fa4162537c149100f", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Quick Transcript\" sample workflow"), + "90a64c7092ea735f9791e3f476d3be92"}), "511c1cb0d8f5735a8154ab18672d20a5", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Quick Transcript\" sample workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "d091d09e6e2c99599fd69b58804eaa87"}), "c98e7dc4287c31538f374acedb3eddd4", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I run the workflow"), + "d7259a7bba691351aecfa9ab3bbd9103"}), "699ef339828fcd58b494103ce7e6fa4c", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a3e34632d7fdd35484a1255d83760e98"}), "86e7422ce40fbf54a02e9f53ebe1fa7e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should open with recording controls"), + "a417c3b80203a35c8680ff91a3ee9c44"}), "0690d9984ab2075cba368b82f5daacd5", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should open with recording controls"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "bd2873d6de57af53b190b3a3c5d70138"}), "34621a6942d7af5c9e452a10912a41a7", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I start recording in the run assistant"), + "6224c8c8ebb0f952ac4b5739cff812da"}), "8f3f975864429f5ab6d0ef0cf819c447", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I start recording in the run assistant"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e105d5fe019d615db9073b07a6a38b64"}), "a23e8363714b545d8bcd3ff485be77da", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I stop recording in the run assistant"), + "94038edcbc021e538bf0aee8e4c4f216"}), "6a1d8fbd6d72b45dbe1b4a62c49dae54", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I stop recording in the run assistant"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "92fc879d403425588bde6cb8f5c1df5b"}), "9d2b717d5883e0568014b71bab0ed6f3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should show captured audio"), + "ac0bebe5842a2a5692a1753a5d6a0d55"}), "ba818ab5a90f8254becb733f7d521ee1", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should show captured audio"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "9ef988855c5b7750908f442bfd2ad8d7"}), "4536d46ac136fa5280f4ae9de9168685", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I complete the run assistant flow and start the workflow"), + "af3500a571486b5e8fbe3fcdb81e49d9"}), "d164c5a1668d5c5aa7656cbf02cc9140", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I complete the run assistant flow and start the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "0482cd69f0834455b6539eefd5785cf8"}), "2f8279b9d6ec855394dbeb8a80ab8df0", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the output feed should show detailed execution telemetry"), + "1f644f58818e9054bbf434dec8fc032a"}), "f4c227d2e9df5f54b19a890ecd311072", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the output feed should show detailed execution telemetry"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e0f6d88cd393db5e937e86dd479f9474"}), "291558261f77755a9612ceee9d51dd96", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the browser should not report run assistant interop errors")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "2bd853a50ad8e65facd10eaa9a3050ef")}), new System.Collections.Generic.List(new string[] { - "eb71df5e6266b35c8b4d98958ff078d8"})), - new global::Io.Cucumber.Messages.Types.Pickle("aafd66f910400d5e98a95795a3921a22", "Features/RunAssistant.feature", "Run assistant recovers when stopping recording fails", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "21c751f29bb78e5f9368f564374bbcb8"}), "8ef0b3957f6c925586355761949fddc7", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the browser should not report run assistant interop errors")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4358eba403bf9d5a88e2991d960afce7")}), new System.Collections.Generic.List(new string[] { + "1176a38a28805555a8b07342c847ced9"})), + new global::Io.Cucumber.Messages.Types.Pickle("07902bed39217357b4503c129afad83e", "Features/RunAssistant.feature", "Run assistant recovers when stopping recording fails", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "85e12744cb984357b9b7e57d8498105a"}), "aac2434f006de159bbf1323550a1ec75", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the browser voice recorder stop fails after transcription halts"), + "5fcdccff5371cf50b41d8394816a6f6b"}), "dec3deeb851ef85fafb8c4f90767d020", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the browser voice recorder stop fails after transcription halts"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "50e901e144c9b454886a04678c2c0974"}), "21db957d41d57f5f84552903f26f8640", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "07d86a9fda6bfb559c49d1d10649e63f"}), "881dc4c81c6893578648d136e8084065", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "20dca46b7dedbc549246f20a370e41a0"}), "c3ebfc1e6e004255b734c03e49777460", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Quick Transcript\" sample workflow"), + "f37b3d1e4f4d3652be38cdb0341167e1"}), "aa15fdd8f72c9050b645d29e79f0ccb1", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Quick Transcript\" sample workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4252a7514095fd58a2f7e395517b80ad"}), "947e9373e7a2aa538aa6cf118840b2a7", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I run the workflow"), + "29ee9af5a7c3ab5fb1a5522655f699f3"}), "a910ac17644c94518b70cd9a2382fa70", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4442b9c464248b5c950ca6f78e47f9b3"}), "426b78a24a9bfb579a0b7b9b8062020c", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should open with recording controls"), + "3aed1f8c6883a054b1688c4c0f0d0ab1"}), "fa95e30dc5a7c45c9ed2843bc54794ee", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should open with recording controls"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "1b9ce1c18651df5ab8ed00ab6d496370"}), "ab1063e7eaeaa95eac6b2b27e2ee4e89", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I start recording in the run assistant"), + "3c153b056ad71252bcfc6e522f8a17f8"}), "ac46d66d1627155db95ca36e75da0f9b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I start recording in the run assistant"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ec51ac4f3bac025794ac26c1932feb2b"}), "3cb1f36e44a93550ad2c98482bfe5363", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "stopping recording fails in the run assistant"), + "e1cc2cbdeecfaf5d874ec72ebe36df75"}), "991d31818941f052a618a402414cc0b1", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "stopping recording fails in the run assistant"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "5c5f565c1d852b5686cd084caa0e66a8"}), "515a7b2eec61ce54985113bddfc1a19f", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should reset recording controls after a stop failure"), + "46d218c082801b5d88ad587bd6c8ac99"}), "678ffa659e15a650bb2fdb3b7116d7d5", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run assistant should reset recording controls after a stop failure"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "62fcf672eecbbb5facce4b73ed2996f7"}), "eb8ced772e35635db477e5b6af35c012", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the browser should not report run assistant interop errors")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "2bd853a50ad8e65facd10eaa9a3050ef")}), new System.Collections.Generic.List(new string[] { - "042f870b0e5c2e548a7e055a9a99f921"}))}); + "a0f1ba4da80893538a0f477dc5b904dc"}), "fb31ce9cd8ea1150922a5f6e431f7e7e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the browser should not report run assistant interop errors")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4358eba403bf9d5a88e2991d960afce7")}), new System.Collections.Generic.List(new string[] { + "315704f33f56975e991d5a07ae666867"}))}); } private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() diff --git a/tests/WorkflowFramework.Dashboard.UITests/Features/SampleWorkflows.feature.cs b/tests/WorkflowFramework.Dashboard.UITests/Features/SampleWorkflows.feature.cs index 2372d25..677b335 100644 --- a/tests/WorkflowFramework.Dashboard.UITests/Features/SampleWorkflows.feature.cs +++ b/tests/WorkflowFramework.Dashboard.UITests/Features/SampleWorkflows.feature.cs @@ -149,103 +149,103 @@ And the url field should not be empty private static global::Io.Cucumber.Messages.Types.GherkinDocument GherkinDocumentFunc() { return new global::Io.Cucumber.Messages.Types.GherkinDocument("Features/SampleWorkflows.feature", new global::Io.Cucumber.Messages.Types.Feature(new global::Io.Cucumber.Messages.Types.Location(2, new System.Nullable(1)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "9d7e94ee5ccce257b86315591aff760b")}), "en", "Feature", "Sample Workflows", " Pre-loaded sample workflows are available and fully configured", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "06c496e06f59265eb5e481f1ccf89fc7")}), "en", "Feature", "Sample Workflows", " Pre-loaded sample workflows are available and fully configured", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Sample workflows appear in workflow list", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "deb19c37d1d87f53bba41ac0bf70f589"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the workflow list dialog", null, null, "aa60bb159c95f256ac29df4996e10fad"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see at least 10 sample workflows", null, null, "e2355b740cdd9650977d7ba705dfd0d1"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see \"Hello World\" in the list", null, null, "ff1a09292f70bc538488590cc572d5f8"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see \"TaskStream\" in the list", null, null, "251acebf8f2405558b1d14cd356a0068"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see \"Local Ollama Smoke Test\" in the list", null, null, "b907480bc5f5a55a8d328cc682ec1479"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(12, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see \"Quick Transcript\" in the list", null, null, "4670ea226ab9df52b0df550108bad73d")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "aff981ef38d4005e91b5a75f2e5755c1")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "9204a8c9a2fd725fa422e8c3702c35b5"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the workflow list dialog", null, null, "191f878ab339e95792f1fe6932a55edf"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see at least 10 sample workflows", null, null, "a3d17e9427f25a55ac0470e9f03aa34e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see \"Hello World\" in the list", null, null, "2e790e9c8f8b5658882c0ec763e99b33"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see \"TaskStream\" in the list", null, null, "7d27f8117b6ce151a52cbc332a26c764"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see \"Local Ollama Smoke Test\" in the list", null, null, "22d399f1e0506c5d95b6e3acb1979774"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(12, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see \"Quick Transcript\" in the list", null, null, "6a7d06e79643565d8d2349cc531bc226")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "77c0826db23ce85c86863cb82cdca142")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Open a sample workflow and see configured steps", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "cfe0b104ec04ba57a0f8c7bde10d1dc5"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the workflow list dialog", null, null, "7631ed803c2cc759b06c8fe2833a80c3"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Hello World\" workflow", null, null, "9e95370666874250a76f76ec8f8aaae6"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the canvas should have nodes", null, null, "7c85018f1b1fdc59984abc588dcb51b4"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the step list should show steps", null, null, "644812e63d5efa5abca19575318c2342"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the workflow name should be \"Hello World\"", null, null, "6be3cfcd39404e56a7851657575c0f2b")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "c0d9a9d4f8fdbe5d9a1a98a849099803")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "67e37378dc57c650b54f015bbfed5f8e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the workflow list dialog", null, null, "165250f0e45e6359934b4c8bdbaa3c86"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Hello World\" workflow", null, null, "6d80fe0c0ad65a5590399b32e10f62d3"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the canvas should have nodes", null, null, "eca0e2b4b58f80559b6ba6919de16aca"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the step list should show steps", null, null, "a72d0aa09f8ae857ad0783229efa411f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the workflow name should be \"Hello World\"", null, null, "12ed5d389c02c3509a710589e6440203")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "9f375bdd7d6280598eb4b593ae2d919b")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Open AI workflow and verify provider config", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "1d3482b9a06da0528ca9bd94ecd6974e"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the workflow list dialog", null, null, "4a497f9460994c598609ecd37866248b"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Quick Transcript\" workflow", null, null, "7685261c81d1b753b33b7897f101a5ce"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(26, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click on a node of type \"LlmCallStep\"", null, null, "32d15987e96c6350818cd72d9939fa22"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(27, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show \"AI Provider\" configuration", null, null, "a462bf0295260b59bbbd506d02122e99"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the provider field should have a value", null, null, "f6f59d4190e4765cb84081b138859d3a")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "ab1fbdd619fd8a559a4fd47e14c2b7a1")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "d7ba66c001e5225c812fc549542c94fc"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the workflow list dialog", null, null, "d17e2211b3e88851beb4ceee530252f4"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Quick Transcript\" workflow", null, null, "5ca5bb272fa3b05c88058b71fe689c0a"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(26, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click on a node of type \"LlmCallStep\"", null, null, "9dfcea9d9d95765599530fced5cb583b"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(27, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show \"AI Provider\" configuration", null, null, "8cef97aa63f9d0528096a999e9f9742e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the provider field should have a value", null, null, "79f7a5d6c79fa4589f6df83d0e4f12e9")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "725b67ea17c5475188e2c57e364d210a")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Open HTTP workflow and verify URL config", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "a56fab9dbff87454b765a5589bca36fe"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the workflow list dialog", null, null, "1670c3797c785853bf3f541b0468f511"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"HTTP API Orchestration\" workflow", null, null, "800a8fbf217a0c59a5096790c4da1ce7"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(34, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click on a node of type \"HttpStep\"", null, null, "ea39aef61507935c9f71d5e8c9cb1a3f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show \"URL\" configuration", null, null, "7c82bd0c01f27556a5db5595b42e3d5c"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the url field should not be empty", null, null, "6526e5f2f71b7259b9695cbb3433ef79")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "641f32cf48e8ae559740b5f0a63ed9f7"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "d61ef49d2f467658af2d5e0931b13848"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the workflow list dialog", null, null, "e8a73ce745387c51ae32a056b9c095be"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"HTTP API Orchestration\" workflow", null, null, "18d751f8eeef50598221493c82aa1e1d"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(34, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click on a node of type \"HttpStep\"", null, null, "53cd374ae48a0b5daca3adfbdb0880c5"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show \"URL\" configuration", null, null, "8639933d8b4f3c599b9f15475996f116"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the url field should not be empty", null, null, "5a10664bd9bf7a56b21af9aa64946b84")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "f697716a3efb795b8f854d0c123d999c"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); } private static global::System.Collections.Generic.IEnumerable PicklesFunc() { return new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Pickle[] { - new global::Io.Cucumber.Messages.Types.Pickle("6134f4c0da11845f87b0f95debfbb101", "Features/SampleWorkflows.feature", "Sample workflows appear in workflow list", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + new global::Io.Cucumber.Messages.Types.Pickle("fb3bdad29aa24e57b53544f0a3eef403", "Features/SampleWorkflows.feature", "Sample workflows appear in workflow list", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "deb19c37d1d87f53bba41ac0bf70f589"}), "588c997202be96558f193c2690891344", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "9204a8c9a2fd725fa422e8c3702c35b5"}), "41b0cb4d22f10c5e8277c38a6262a5dc", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "aa60bb159c95f256ac29df4996e10fad"}), "38170a4fc4d9c3549d7005f4bd9592a8", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the workflow list dialog"), + "191f878ab339e95792f1fe6932a55edf"}), "0e361baece0b935bb209ea3fd748a0d5", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the workflow list dialog"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e2355b740cdd9650977d7ba705dfd0d1"}), "1a0a995560ae125884593dbfc5262ab9", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see at least 10 sample workflows"), + "a3d17e9427f25a55ac0470e9f03aa34e"}), "18f0e7cd58beba5291c5359eb0904d43", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see at least 10 sample workflows"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ff1a09292f70bc538488590cc572d5f8"}), "d04cd48883fd9458afe852593ed67320", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see \"Hello World\" in the list"), + "2e790e9c8f8b5658882c0ec763e99b33"}), "5b15e930d0792853855b98b7d0262624", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see \"Hello World\" in the list"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "251acebf8f2405558b1d14cd356a0068"}), "af7d9bd4bf0ce3538d7321fa9f6a301e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see \"TaskStream\" in the list"), + "7d27f8117b6ce151a52cbc332a26c764"}), "996a4cd433860659b26a5c21b142088a", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see \"TaskStream\" in the list"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "b907480bc5f5a55a8d328cc682ec1479"}), "200454acde0251519867fb432f60deab", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see \"Local Ollama Smoke Test\" in the list"), + "22d399f1e0506c5d95b6e3acb1979774"}), "bc89da59125f23599f7865afc13e5e76", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see \"Local Ollama Smoke Test\" in the list"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4670ea226ab9df52b0df550108bad73d"}), "c969122d80ac415b8957a9c50e34094d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see \"Quick Transcript\" in the list")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9d7e94ee5ccce257b86315591aff760b")}), new System.Collections.Generic.List(new string[] { - "aff981ef38d4005e91b5a75f2e5755c1"})), - new global::Io.Cucumber.Messages.Types.Pickle("e7ead3d5ccb7b35eb1c0389400b39f6f", "Features/SampleWorkflows.feature", "Open a sample workflow and see configured steps", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "6a7d06e79643565d8d2349cc531bc226"}), "99e8af0e8ca28058af06f61ab0fdd1f4", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see \"Quick Transcript\" in the list")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "06c496e06f59265eb5e481f1ccf89fc7")}), new System.Collections.Generic.List(new string[] { + "77c0826db23ce85c86863cb82cdca142"})), + new global::Io.Cucumber.Messages.Types.Pickle("bcc8259729ccbf5b84d8eee1be2a3e2f", "Features/SampleWorkflows.feature", "Open a sample workflow and see configured steps", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "cfe0b104ec04ba57a0f8c7bde10d1dc5"}), "f449ff639c1e4853af86c703774e8692", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "67e37378dc57c650b54f015bbfed5f8e"}), "4a117d287a69585d99043c142f3fc938", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7631ed803c2cc759b06c8fe2833a80c3"}), "168a8f8d3512ff50885ec469cd4b00b4", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the workflow list dialog"), + "165250f0e45e6359934b4c8bdbaa3c86"}), "a10ceb2942b68959a7b15e78d8d12393", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the workflow list dialog"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "9e95370666874250a76f76ec8f8aaae6"}), "95c47c9fe3ea955a97f746c895fa7230", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the \"Hello World\" workflow"), + "6d80fe0c0ad65a5590399b32e10f62d3"}), "34301bb7d37629569588a17a21f0c749", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the \"Hello World\" workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7c85018f1b1fdc59984abc588dcb51b4"}), "88f1b6f6b0a1035cbcc8045b65584772", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the canvas should have nodes"), + "eca0e2b4b58f80559b6ba6919de16aca"}), "5a68a64bf448ec5bb8b8e0c3aab65768", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the canvas should have nodes"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "644812e63d5efa5abca19575318c2342"}), "155b3798a1bfef53b658670be8366f3c", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the step list should show steps"), + "a72d0aa09f8ae857ad0783229efa411f"}), "798e9dd760ec1259acab63bcf511dde9", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the step list should show steps"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "6be3cfcd39404e56a7851657575c0f2b"}), "e39d0221b3ab0a55b25e29874eb3fe01", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the workflow name should be \"Hello World\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9d7e94ee5ccce257b86315591aff760b")}), new System.Collections.Generic.List(new string[] { - "c0d9a9d4f8fdbe5d9a1a98a849099803"})), - new global::Io.Cucumber.Messages.Types.Pickle("77a2860399ca9352a24c8d03f1e60c09", "Features/SampleWorkflows.feature", "Open AI workflow and verify provider config", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "12ed5d389c02c3509a710589e6440203"}), "d2f995e4ad496851a2aa5bfe1d655761", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the workflow name should be \"Hello World\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "06c496e06f59265eb5e481f1ccf89fc7")}), new System.Collections.Generic.List(new string[] { + "9f375bdd7d6280598eb4b593ae2d919b"})), + new global::Io.Cucumber.Messages.Types.Pickle("5411a692b0d55954be7cd275907c66e9", "Features/SampleWorkflows.feature", "Open AI workflow and verify provider config", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "1d3482b9a06da0528ca9bd94ecd6974e"}), "914cd46dcb18fd58b9b8cc493c5a822e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "d7ba66c001e5225c812fc549542c94fc"}), "c02ada3e5abe2255901efb5171be3287", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4a497f9460994c598609ecd37866248b"}), "1f8397373dc40b5b948a504caa9c54e7", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the workflow list dialog"), + "d17e2211b3e88851beb4ceee530252f4"}), "43bfd6e0a7657253b16dbb11032b7534", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the workflow list dialog"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7685261c81d1b753b33b7897f101a5ce"}), "51c6e108092aa95292a82440ccd3ddeb", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the \"Quick Transcript\" workflow"), + "5ca5bb272fa3b05c88058b71fe689c0a"}), "ebb168ff19f9305aaaeb89f6dc6adfb0", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the \"Quick Transcript\" workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "32d15987e96c6350818cd72d9939fa22"}), "1b5520e1d036265ebf7f49d9a2a17755", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click on a node of type \"LlmCallStep\""), + "9dfcea9d9d95765599530fced5cb583b"}), "22f3bb0098375658aa084b826f521257", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click on a node of type \"LlmCallStep\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a462bf0295260b59bbbd506d02122e99"}), "b7d1a8fd5d9f5451abc1057f1027231e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show \"AI Provider\" configuration"), + "8cef97aa63f9d0528096a999e9f9742e"}), "0948fa4265c89051bf1ba484bca97dac", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show \"AI Provider\" configuration"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f6f59d4190e4765cb84081b138859d3a"}), "02a8ab69d4e84d56a75f216bb56c9105", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the provider field should have a value")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9d7e94ee5ccce257b86315591aff760b")}), new System.Collections.Generic.List(new string[] { - "ab1fbdd619fd8a559a4fd47e14c2b7a1"})), - new global::Io.Cucumber.Messages.Types.Pickle("b897e680399d995abbff8269901b5b6a", "Features/SampleWorkflows.feature", "Open HTTP workflow and verify URL config", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "79f7a5d6c79fa4589f6df83d0e4f12e9"}), "c35a78b2adf40856a221c4ce6c12cb75", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the provider field should have a value")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "06c496e06f59265eb5e481f1ccf89fc7")}), new System.Collections.Generic.List(new string[] { + "725b67ea17c5475188e2c57e364d210a"})), + new global::Io.Cucumber.Messages.Types.Pickle("a852b8a5da6a70598bcb7536c0cf7f32", "Features/SampleWorkflows.feature", "Open HTTP workflow and verify URL config", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a56fab9dbff87454b765a5589bca36fe"}), "63bfb4bd22b07c5bbbf61fde21a0229e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "d61ef49d2f467658af2d5e0931b13848"}), "271e9ff339844c5a97a2f12b2f8e9d47", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "1670c3797c785853bf3f541b0468f511"}), "39a016e053666c58bbc30e01a5a2fbe1", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the workflow list dialog"), + "e8a73ce745387c51ae32a056b9c095be"}), "ab67b5e3cd13ae57809d481a51f77d97", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the workflow list dialog"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "800a8fbf217a0c59a5096790c4da1ce7"}), "3dbe23e5ea1d1c5793b6d561d6e2d5a5", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the \"HTTP API Orchestration\" workflow"), + "18d751f8eeef50598221493c82aa1e1d"}), "7c6f5d12a2d2db5e81234b78e0204620", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the \"HTTP API Orchestration\" workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ea39aef61507935c9f71d5e8c9cb1a3f"}), "c9cb0b172eb8735aa02194379717df2c", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click on a node of type \"HttpStep\""), + "53cd374ae48a0b5daca3adfbdb0880c5"}), "97fbf2f450cf535c862e89ff978798f3", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click on a node of type \"HttpStep\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7c82bd0c01f27556a5db5595b42e3d5c"}), "7e4f7ad32f8d9b569c875e1a1dd368a3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show \"URL\" configuration"), + "8639933d8b4f3c599b9f15475996f116"}), "6367008194d23f5e9595feee396463d8", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show \"URL\" configuration"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "6526e5f2f71b7259b9695cbb3433ef79"}), "0a2d482fd5e40a53aeff8353ad1832a9", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the url field should not be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "9d7e94ee5ccce257b86315591aff760b")}), new System.Collections.Generic.List(new string[] { - "641f32cf48e8ae559740b5f0a63ed9f7"}))}); + "5a10664bd9bf7a56b21af9aa64946b84"}), "97fc428d6962925ab32b5f0212a8b242", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the url field should not be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "06c496e06f59265eb5e481f1ccf89fc7")}), new System.Collections.Generic.List(new string[] { + "f697716a3efb795b8f854d0c123d999c"}))}); } private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() diff --git a/tests/WorkflowFramework.Dashboard.UITests/Features/Settings.feature.cs b/tests/WorkflowFramework.Dashboard.UITests/Features/Settings.feature.cs index 6ae175d..a45c028 100644 --- a/tests/WorkflowFramework.Dashboard.UITests/Features/Settings.feature.cs +++ b/tests/WorkflowFramework.Dashboard.UITests/Features/Settings.feature.cs @@ -107,282 +107,281 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo, globa private static global::Io.Cucumber.Messages.Types.Source SourceFunc() { - return new global::Io.Cucumber.Messages.Types.Source("Features/Settings.feature", "@UI\r\nFeature: Settings Management\r\n As a user I can configure AI providers and e" + - "xecution settings\r\n\r\n Scenario: Navigate to settings page\r\n Given the dashbo" + - "ard is running\r\n When I click the Settings nav link\r\n Then I should see th" + - "e settings page\r\n And I should see the AI Providers section\r\n And I should" + - " see the Execution section\r\n\r\n Scenario: Configure Ollama provider\r\n Given t" + - "he dashboard is running\r\n And I am on the settings page\r\n When I set the O" + - "llama URL to \"http://localhost:11434\"\r\n And I click Save Settings\r\n Then I" + - " should see a success toast\r\n\r\n Scenario: Select default provider and model\r\n " + - " Given the dashboard is running\r\n And I am on the settings page\r\n When I " + - "select \"ollama\" as the default provider\r\n Then the model dropdown should be p" + - "opulated\r\n When I select a model\r\n And I click Save Settings\r\n Then the" + - " settings should persist\r\n\r\n Scenario: Test Ollama connection\r\n Given the da" + - "shboard is running\r\n And I am on the settings page\r\n When I click Test Con" + - "nection\r\n Then I should see a connection test result\r\n\r\n Scenario Outline: C" + - "loud providers can be configured without stored credentials\r\n Given the dashb" + - "oard is running\r\n And I am on the settings page\r\n When I select \"\" as the default provider\r\n Then the model dropdown should be populated\r\n " + - " When I select a model\r\n And I click Save Settings\r\n Then I should see a s" + - "uccess toast\r\n When I reload the settings page\r\n Then \"\" should " + - "be selected as the default provider\r\n And the \"\" provider should sh" + - "ow as not configured\r\n And the \"\" API key field should be empty\r\n\r\n" + - " Examples:\r\n | provider |\r\n | openai |\r\n | anthropic " + - " |\r\n | huggingface |\r\n\r\n @sensitive\r\n Scenario: Saved provider keys are n" + - "ot echoed back to the browser\r\n Given the dashboard is running\r\n And I am " + - "on the settings page\r\n When I enter \"test-openai-key\" as the OpenAI API key\r\n" + - " And I click Save Settings\r\n And I reload the settings page\r\n Then the " + - "OpenAI provider should show as configured\r\n And the OpenAI API key field shou" + - "ld be empty\r\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); + return new global::Io.Cucumber.Messages.Types.Source("Features/Settings.feature", "@UI\nFeature: Settings Management\n As a user I can configure AI providers and exe" + + "cution settings\n\n Scenario: Navigate to settings page\n Given the dashboard i" + + "s running\n When I click the Settings nav link\n Then I should see the setti" + + "ngs page\n And I should see the AI Providers section\n And I should see the " + + "Execution section\n\n Scenario: Configure Ollama provider\n Given the dashboard" + + " is running\n And I am on the settings page\n When I set the Ollama URL to \"" + + "http://localhost:11434\"\n And I click Save Settings\n Then I should see a su" + + "ccess toast\n\n Scenario: Select default provider and model\n Given the dashboa" + + "rd is running\n And I am on the settings page\n When I select \"ollama\" as th" + + "e default provider\n Then the model dropdown should be populated\n When I se" + + "lect a model\n And I click Save Settings\n Then the settings should persist\n" + + "\n Scenario: Test Ollama connection\n Given the dashboard is running\n And I" + + " am on the settings page\n When I click Test Connection\n Then I should see " + + "a connection test result\n\n Scenario Outline: Cloud providers can be configured " + + "without stored credentials\n Given the dashboard is running\n And I am on th" + + "e settings page\n When I select \"\" as the default provider\n Then " + + "the model dropdown should be populated\n When I select a model\n And I click" + + " Save Settings\n Then I should see a success toast\n When I reload the setti" + + "ngs page\n Then \"\" should be selected as the default provider\n An" + + "d the \"\" provider should show as not configured\n And the \"\" API key field should be empty\n\n Examples:\n | provider |\n | op" + + "enai |\n | anthropic |\n | huggingface |\n\n @sensitive\n Scenario" + + ": Saved provider keys are not echoed back to the browser\n Given the dashboard" + + " is running\n And I am on the settings page\n When I enter \"test-openai-key\"" + + " as the OpenAI API key\n And I click Save Settings\n And I reload the settin" + + "gs page\n Then the OpenAI provider should show as configured\n And the OpenA" + + "I API key field should be empty\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); } private static global::Io.Cucumber.Messages.Types.GherkinDocument GherkinDocumentFunc() { return new global::Io.Cucumber.Messages.Types.GherkinDocument("Features/Settings.feature", new global::Io.Cucumber.Messages.Types.Feature(new global::Io.Cucumber.Messages.Types.Location(2, new System.Nullable(1)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2")}), "en", "Feature", "Settings Management", " As a user I can configure AI providers and execution settings", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "4b4ce955a80fe355ba74aed9c177ee71")}), "en", "Feature", "Settings Management", " As a user I can configure AI providers and execution settings", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Navigate to settings page", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "b74c4c232b7a1d53903c45a232e6bb1d"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I click the Settings nav link", null, null, "2ebd76fbbc7ef35ca144deb6cc86d1a1"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see the settings page", null, null, "cea550915bb8fa559ec9c6a3d1321b66"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see the AI Providers section", null, null, "32be8956d7e94a598bb773129eba4adc"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see the Execution section", null, null, "8f73f4872d17935e9718b4232597edc7")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "413483d0e2d98e5cb8b7fd7fc34450e8")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "b62a443b17c2ab5d8b38293529c105f4"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I click the Settings nav link", null, null, "eee355afbb8742589cc2db1e77e40a25"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see the settings page", null, null, "800344bc82c05754bc98e3c6da94f210"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see the AI Providers section", null, null, "ee6a788e8ffd535e868e0034789e9ac4"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see the Execution section", null, null, "116010098794d9589c2802c7357de9b4")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "c744e5bf69560e5799fc505b2365e868")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(12, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Configure Ollama provider", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "2465e7ebe8174c52a35803fa20175460"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "02bfc243c58e6059a2eff11381047475"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I set the Ollama URL to \"http://localhost:11434\"", null, null, "130e31bdf575d151910d9fdb117c3ff4"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "cf64b91fb2eeac5facc5ec966e890162"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a success toast", null, null, "a161dd5d059aae52846327d465cf9b62")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "1beed4dbf7f06d5c9add99bf7401c783")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "28d4c2ec84a39d5c8fb1ee3f527d8a83"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "30ec1b34ee75115b8010b46c7f98edf6"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I set the Ollama URL to \"http://localhost:11434\"", null, null, "751984921279f55ca6a60c74a96826ce"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "8e1a2b0ef44435538c45e08bf13ec320"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a success toast", null, null, "a1ece36bd9c808539c91b3a5e625c79e")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "54292e89ffb7585a8b61cd1f46f11346")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Select default provider and model", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "4e6558196d0dee548595fd55801d9085"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "61d09f1c724ab15db810dad2e7de23d5"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select \"ollama\" as the default provider", null, null, "03edba6a7010f955a32855a56c1785ad"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the model dropdown should be populated", null, null, "096ebec0265c4f5b8efcca8cff82608f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select a model", null, null, "32ea1bc5fc0dce5695f9c93dcc07e28a"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "f9ac7ca59e0efa5ab9bb8575968f038d"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(26, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the settings should persist", null, null, "0d1055db8c22e95ab1d236e71c7b0a58")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "dcd1e9b9d0411f5ca1214589a70b4c21")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "cd6ac52034ceae5ba28f37c4eb9dbdb3"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "ea81ccc868f56658b9a04cde6958afa8"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select \"ollama\" as the default provider", null, null, "eaae712b5780115cb36f8db0b1055124"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the model dropdown should be populated", null, null, "38e95a61bf52655f9bf9de1da9adebf6"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select a model", null, null, "37bbe65b31c9b056a38d4ea9740e4e10"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "3906803adacc8d53969814f9fba8ddd8"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(26, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the settings should persist", null, null, "3177b469475fb455868dfd9bdf11d201")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "d28d88832ca79f5da30bef3b882b8842")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Test Ollama connection", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(29, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "7822276873a18d5ea226dfcde01701d2"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "983c6d5174f2e858bc7894f0281c74f6"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I click Test Connection", null, null, "a36a5bf97c5c045c8619be0b6ca4631e"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a connection test result", null, null, "758fad55be644855b48fc987d7fff21d")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "14524b26320cb75d9413302fec2f593a")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(29, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "684249ab45eb585fae1d6f4dfb4ce474"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "653d6a315c296658b88c95ef47d33991"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I click Test Connection", null, null, "97ed6a506da25251b00d8428afeff789"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a connection test result", null, null, "0d2683d25383325da0e56dddeb0ca000")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "f47337d802534f50935c168f2adcc8ac")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(34, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario Outline", "Cloud providers can be configured without stored credentials", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "46c69d9d4a6cd95ab1233f9906741bbf"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "f28d247220d3d75792c1e857110e1009"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(37, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select \"\" as the default provider", null, null, "3becd9defc6fe15398f14bf9d75e46ac"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(38, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the model dropdown should be populated", null, null, "f431b767e44c1359876467a46b42df89"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(39, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select a model", null, null, "30dc41f75e13a259a1cfb7c3326fba0f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(40, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "2e5fe4df1efbce54a7285a33dcb2b417"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(41, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a success toast", null, null, "916f7ba42410eb55aeb78249a4e7141a"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(42, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I reload the settings page", null, null, "2c0db704b0abd35596ad1316e1ebe0ea"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(43, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "\"\" should be selected as the default provider", null, null, "e98ae53abc3f5f53901c5b2b632e2712"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(44, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the \"\" provider should show as not configured", null, null, "e64bcfbff2bdea5791f9ca85ee930677"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(45, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the \"\" API key field should be empty", null, null, "eaa9bc68e7c2d3569c2dc43b5ffae9d3")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[] { + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "50124a4fca991e589a7ae8e5d594a40a"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "52eae2f5d4ed2f5f9fa73cb256d2bc5e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(37, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select \"\" as the default provider", null, null, "ad6c821acf3b805fb43fb0b9a02aedd3"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(38, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the model dropdown should be populated", null, null, "2e3bff627cafa15cb77c3d14a42ad4c9"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(39, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select a model", null, null, "d23835321bc88e5fa2c715aa3e6d58ab"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(40, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "2f2e5f9c2e617d5aa98013183c79ccca"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(41, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a success toast", null, null, "7ca52f876fce2255b82aab0945a6a733"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(42, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I reload the settings page", null, null, "adc7809311ce9555b70a28a1abc77479"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(43, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "\"\" should be selected as the default provider", null, null, "0c1f39c3e4bcef5380c47862dc0ab926"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(44, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the \"\" provider should show as not configured", null, null, "9717e19addaf865790552913a349c894"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(45, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the \"\" API key field should be empty", null, null, "329ad774bfe52d539bfd3f411e44e3f1")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[] { new global::Io.Cucumber.Messages.Types.Examples(new global::Io.Cucumber.Messages.Types.Location(47, new System.Nullable(5)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Examples", "", "", new global::Io.Cucumber.Messages.Types.TableRow(new global::Io.Cucumber.Messages.Types.Location(48, new System.Nullable(7)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.TableCell[] { - new global::Io.Cucumber.Messages.Types.TableCell(new global::Io.Cucumber.Messages.Types.Location(48, new System.Nullable(9)), "provider")}), "4af40b81ebd1dd5bb4e9b3b28e11d061"), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.TableRow[] { + new global::Io.Cucumber.Messages.Types.TableCell(new global::Io.Cucumber.Messages.Types.Location(48, new System.Nullable(9)), "provider")}), "3ccadb9868a66657bea2bc265596b223"), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.TableRow[] { new global::Io.Cucumber.Messages.Types.TableRow(new global::Io.Cucumber.Messages.Types.Location(49, new System.Nullable(7)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.TableCell[] { - new global::Io.Cucumber.Messages.Types.TableCell(new global::Io.Cucumber.Messages.Types.Location(49, new System.Nullable(9)), "openai")}), "69b8a1b29d20d950830716da4e623889"), + new global::Io.Cucumber.Messages.Types.TableCell(new global::Io.Cucumber.Messages.Types.Location(49, new System.Nullable(9)), "openai")}), "9d0abccf32e4285f8e31f441f15d1b72"), new global::Io.Cucumber.Messages.Types.TableRow(new global::Io.Cucumber.Messages.Types.Location(50, new System.Nullable(7)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.TableCell[] { - new global::Io.Cucumber.Messages.Types.TableCell(new global::Io.Cucumber.Messages.Types.Location(50, new System.Nullable(9)), "anthropic")}), "b9d2e35c87d9515a80faed2da2bcc3a4"), + new global::Io.Cucumber.Messages.Types.TableCell(new global::Io.Cucumber.Messages.Types.Location(50, new System.Nullable(9)), "anthropic")}), "c8d2c2782f0da55bb3f57899f9871fee"), new global::Io.Cucumber.Messages.Types.TableRow(new global::Io.Cucumber.Messages.Types.Location(51, new System.Nullable(7)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.TableCell[] { - new global::Io.Cucumber.Messages.Types.TableCell(new global::Io.Cucumber.Messages.Types.Location(51, new System.Nullable(9)), "huggingface")}), "7e8d584d3c31d35688353a4d94984b88")}), "7d80958ee1c75f52afe3f637cab6b16f")}), "c37defe9045504518ae1187dc13102e8")), + new global::Io.Cucumber.Messages.Types.TableCell(new global::Io.Cucumber.Messages.Types.Location(51, new System.Nullable(9)), "huggingface")}), "2c1b6b5b6df8da5b86c66090349012fb")}), "9b34623ddbfa2e59b82247fb301e5536")}), "e3b48c98d19d9f55a84cda0b67cec482")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(54, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(53, new System.Nullable(3)), "@sensitive", "a785d55c9b7c09579c07baaaca57a95c")}), "Scenario", "Saved provider keys are not echoed back to the browser", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(55, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "ea5e6caddb71cf519249f7154e9946b9"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(56, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "f8175a066c26cc5bab3ad05ffd8f8837"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(57, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I enter \"test-openai-key\" as the OpenAI API key", null, null, "cc12ac1dd9575d5eb0cdfc91210c2f7b"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(58, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "235e4643a5d3b75fb1a1e6f43f80d3e5"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(59, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I reload the settings page", null, null, "213429c60b5e6c58a5abda4821762f39"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(60, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the OpenAI provider should show as configured", null, null, "a674ffc572b42d59baeab89ff98cfe2c"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(61, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the OpenAI API key field should be empty", null, null, "8905e1060aed4c51a5dcd53f6b2d8d12")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "0b1b12a491d4b25e8d1dde76e534f480"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(53, new System.Nullable(3)), "@sensitive", "95b78564bf160a57a36b5132081c6eb4")}), "Scenario", "Saved provider keys are not echoed back to the browser", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(55, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "03a4706908da1655bbbedbe69734582a"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(56, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "ed68535539bb6d588636e73afcef8190"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(57, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I enter \"test-openai-key\" as the OpenAI API key", null, null, "01dcc9cd4b369f5c9e48a763b91ce8e7"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(58, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "b70490fa523155579dad41749d6a27c2"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(59, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I reload the settings page", null, null, "cb2a3a61d6cd4359a0f6e85d5d2462a2"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(60, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the OpenAI provider should show as configured", null, null, "47ad022eaa298b5590a1ac750db19988"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(61, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the OpenAI API key field should be empty", null, null, "ac5a22420f872d55a0975d9deff5b492")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "bebbb69f2c72b85b9afb496a914bc56c"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); } private static global::System.Collections.Generic.IEnumerable PicklesFunc() { return new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Pickle[] { - new global::Io.Cucumber.Messages.Types.Pickle("f548a187d9dffc5b8699203723fe1b46", "Features/Settings.feature", "Navigate to settings page", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + new global::Io.Cucumber.Messages.Types.Pickle("a559e825d1b767599c03ef67af6f8179", "Features/Settings.feature", "Navigate to settings page", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "b74c4c232b7a1d53903c45a232e6bb1d"}), "dc0f1494a40f4057a494572c3f72f4f5", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "b62a443b17c2ab5d8b38293529c105f4"}), "bb83e401d79ef555a5014af4802264b8", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2ebd76fbbc7ef35ca144deb6cc86d1a1"}), "c3ecd5b02e66d45098b70e1bd080cc93", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click the Settings nav link"), + "eee355afbb8742589cc2db1e77e40a25"}), "63f4f82077e4c25c883fa017a8869175", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click the Settings nav link"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "cea550915bb8fa559ec9c6a3d1321b66"}), "7dc9d26a2de68d5fa69ad93944303ce2", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the settings page"), + "800344bc82c05754bc98e3c6da94f210"}), "6d957344b9f89b5c86ce090d27d9fe25", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "32be8956d7e94a598bb773129eba4adc"}), "daecd941da7f0b5d9d43a48cd9dd2231", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the AI Providers section"), + "ee6a788e8ffd535e868e0034789e9ac4"}), "ec2c0ae887d3495fabc58721518b1c70", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the AI Providers section"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "8f73f4872d17935e9718b4232597edc7"}), "8c98dc0543de77508579944458dbd4e2", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the Execution section")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2")}), new System.Collections.Generic.List(new string[] { - "413483d0e2d98e5cb8b7fd7fc34450e8"})), - new global::Io.Cucumber.Messages.Types.Pickle("164bda7bc7c75c5d8ad9a62baf9009ad", "Features/Settings.feature", "Configure Ollama provider", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "116010098794d9589c2802c7357de9b4"}), "d6e8a7955093c050938f63d8e1918930", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the Execution section")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4b4ce955a80fe355ba74aed9c177ee71")}), new System.Collections.Generic.List(new string[] { + "c744e5bf69560e5799fc505b2365e868"})), + new global::Io.Cucumber.Messages.Types.Pickle("4200f38c6d13d157b133a351d2de5749", "Features/Settings.feature", "Configure Ollama provider", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2465e7ebe8174c52a35803fa20175460"}), "07295988db190252a43c54147aa137f4", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "28d4c2ec84a39d5c8fb1ee3f527d8a83"}), "d5859e07ae8a975aa62cf73d022ed2e1", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "02bfc243c58e6059a2eff11381047475"}), "bb5b1b4a43f483599071ba7d617d69a4", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), + "30ec1b34ee75115b8010b46c7f98edf6"}), "8444409a1bf8105c9cda1192afc0bdf9", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "130e31bdf575d151910d9fdb117c3ff4"}), "b3c543463bb2f653a17e2c3b3467d398", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I set the Ollama URL to \"http://localhost:11434\""), + "751984921279f55ca6a60c74a96826ce"}), "6db13cf793e41d51a75d2703f95d3153", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I set the Ollama URL to \"http://localhost:11434\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "cf64b91fb2eeac5facc5ec966e890162"}), "fec1e48775a60c57a85066e89e0bcd96", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), + "8e1a2b0ef44435538c45e08bf13ec320"}), "9505991b21aa955aaf990042136b4af4", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a161dd5d059aae52846327d465cf9b62"}), "efab5d6720337b5e858cfa427e55c833", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2")}), new System.Collections.Generic.List(new string[] { - "1beed4dbf7f06d5c9add99bf7401c783"})), - new global::Io.Cucumber.Messages.Types.Pickle("c7dcb08cfd093f53960804814085a8ba", "Features/Settings.feature", "Select default provider and model", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "a1ece36bd9c808539c91b3a5e625c79e"}), "4b05d7f381084352a890b7cafa24fa8e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4b4ce955a80fe355ba74aed9c177ee71")}), new System.Collections.Generic.List(new string[] { + "54292e89ffb7585a8b61cd1f46f11346"})), + new global::Io.Cucumber.Messages.Types.Pickle("737fdc6dd7c2e351ac4630b9f1c34f9d", "Features/Settings.feature", "Select default provider and model", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4e6558196d0dee548595fd55801d9085"}), "a5d384d90ecec85f86f89580b4fde332", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "cd6ac52034ceae5ba28f37c4eb9dbdb3"}), "998575ddf1f83b58b12789be42e026b6", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "61d09f1c724ab15db810dad2e7de23d5"}), "3c1b28f206520c58ababcdd791b50279", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), + "ea81ccc868f56658b9a04cde6958afa8"}), "bc97d46b9f12d25a8d83208e289a32a7", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "03edba6a7010f955a32855a56c1785ad"}), "17e04f5e0be6455e8f89de422b4a5fc4", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"ollama\" as the default provider"), + "eaae712b5780115cb36f8db0b1055124"}), "0c85219a5135b95d9299c32b10b9dcf1", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"ollama\" as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "096ebec0265c4f5b8efcca8cff82608f"}), "ac199e57f149395ea3f2ff624174c1a2", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), + "38e95a61bf52655f9bf9de1da9adebf6"}), "66d23ca0ca36d5598e2f732082c4ca75", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "32ea1bc5fc0dce5695f9c93dcc07e28a"}), "463f46a58ca6df5fbfcb2b194c8d62b1", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), + "37bbe65b31c9b056a38d4ea9740e4e10"}), "50a074d633855d5c87633925b4e26c78", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f9ac7ca59e0efa5ab9bb8575968f038d"}), "c69ec75f8c15625cac6305f57eafb757", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), + "3906803adacc8d53969814f9fba8ddd8"}), "ddcd69f117366d5e8aaf0e9624bea261", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "0d1055db8c22e95ab1d236e71c7b0a58"}), "00c178aebe5dfb549fd73cec8fe9ed31", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the settings should persist")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2")}), new System.Collections.Generic.List(new string[] { - "dcd1e9b9d0411f5ca1214589a70b4c21"})), - new global::Io.Cucumber.Messages.Types.Pickle("7c7da1a29c280358be162c083f27d932", "Features/Settings.feature", "Test Ollama connection", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "3177b469475fb455868dfd9bdf11d201"}), "44827a5d20ab2956825e0b0a8d009223", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the settings should persist")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4b4ce955a80fe355ba74aed9c177ee71")}), new System.Collections.Generic.List(new string[] { + "d28d88832ca79f5da30bef3b882b8842"})), + new global::Io.Cucumber.Messages.Types.Pickle("4530c6c637c8315a9ae052e2d5f154fe", "Features/Settings.feature", "Test Ollama connection", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7822276873a18d5ea226dfcde01701d2"}), "9cdfb6fe10b0db59916488343337a32e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "684249ab45eb585fae1d6f4dfb4ce474"}), "803617c9871b035eb275c1fde85bbb91", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "983c6d5174f2e858bc7894f0281c74f6"}), "8e49f3bb6338565585c735b963504c12", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), + "653d6a315c296658b88c95ef47d33991"}), "f0ee28da13bbab5badf44debbc8f29a5", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a36a5bf97c5c045c8619be0b6ca4631e"}), "b3fb6d9069110551bd541ddc9b312353", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Test Connection"), + "97ed6a506da25251b00d8428afeff789"}), "a017cbe2982b3257a1f076e69f91714b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Test Connection"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "758fad55be644855b48fc987d7fff21d"}), "7933ed57157f97508efa89843aa5f02a", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a connection test result")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2")}), new System.Collections.Generic.List(new string[] { - "14524b26320cb75d9413302fec2f593a"})), - new global::Io.Cucumber.Messages.Types.Pickle("668a6c95dbeb40599f41d5710f3b45a3", "Features/Settings.feature", "Cloud providers can be configured without stored credentials", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "0d2683d25383325da0e56dddeb0ca000"}), "4cbcfd1c4fa1a754b9979a498db5ee38", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a connection test result")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4b4ce955a80fe355ba74aed9c177ee71")}), new System.Collections.Generic.List(new string[] { + "f47337d802534f50935c168f2adcc8ac"})), + new global::Io.Cucumber.Messages.Types.Pickle("b5d1cfe836bf7b5c8553703d41160406", "Features/Settings.feature", "Cloud providers can be configured without stored credentials", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "46c69d9d4a6cd95ab1233f9906741bbf", - "69b8a1b29d20d950830716da4e623889"}), "f7bd70a37af21550be4285cf68c956ce", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "50124a4fca991e589a7ae8e5d594a40a", + "9d0abccf32e4285f8e31f441f15d1b72"}), "9cce03e81e478e5eba56d19a8ae1d68e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f28d247220d3d75792c1e857110e1009", - "69b8a1b29d20d950830716da4e623889"}), "3fb6611a5f64655f8420acfa8bef9a47", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), + "52eae2f5d4ed2f5f9fa73cb256d2bc5e", + "9d0abccf32e4285f8e31f441f15d1b72"}), "aa633829478ef051ac02892f201da62e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3becd9defc6fe15398f14bf9d75e46ac", - "69b8a1b29d20d950830716da4e623889"}), "5c0b29a6a078e157a321bb1d94105169", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"openai\" as the default provider"), + "ad6c821acf3b805fb43fb0b9a02aedd3", + "9d0abccf32e4285f8e31f441f15d1b72"}), "94bac20cadf3055ab2a2747ad1e5c14c", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"openai\" as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f431b767e44c1359876467a46b42df89", - "69b8a1b29d20d950830716da4e623889"}), "9c7b79dba774c0539f10a0847ca194ef", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), + "2e3bff627cafa15cb77c3d14a42ad4c9", + "9d0abccf32e4285f8e31f441f15d1b72"}), "bc15f5939fca2d599a0fad24163788d8", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "30dc41f75e13a259a1cfb7c3326fba0f", - "69b8a1b29d20d950830716da4e623889"}), "44ecfba265cd9659a600da9b0068419a", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), + "d23835321bc88e5fa2c715aa3e6d58ab", + "9d0abccf32e4285f8e31f441f15d1b72"}), "04864c84a3fae8599a5a73a1378e5b6a", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2e5fe4df1efbce54a7285a33dcb2b417", - "69b8a1b29d20d950830716da4e623889"}), "06d44a2e79ef3d5e9e6b569e270ddb31", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), + "2f2e5f9c2e617d5aa98013183c79ccca", + "9d0abccf32e4285f8e31f441f15d1b72"}), "a36111f7f70a365cbdc6967b32fdcb77", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "916f7ba42410eb55aeb78249a4e7141a", - "69b8a1b29d20d950830716da4e623889"}), "78129158164c2d54ad3425d8e2ef38b6", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast"), + "7ca52f876fce2255b82aab0945a6a733", + "9d0abccf32e4285f8e31f441f15d1b72"}), "72fe1f023cf2a0538395665a0d95182f", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2c0db704b0abd35596ad1316e1ebe0ea", - "69b8a1b29d20d950830716da4e623889"}), "cde71b53cb84d752b8937d7333e60f2a", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), + "adc7809311ce9555b70a28a1abc77479", + "9d0abccf32e4285f8e31f441f15d1b72"}), "67d70d1b560ce05f999258d3644168ba", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e98ae53abc3f5f53901c5b2b632e2712", - "69b8a1b29d20d950830716da4e623889"}), "59d10fafc7ba735dba9e6e2daadc636d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "\"openai\" should be selected as the default provider"), + "0c1f39c3e4bcef5380c47862dc0ab926", + "9d0abccf32e4285f8e31f441f15d1b72"}), "33dd863ff1b5d952b6393ced59bd8dc7", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "\"openai\" should be selected as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e64bcfbff2bdea5791f9ca85ee930677", - "69b8a1b29d20d950830716da4e623889"}), "8ae67f71206e915d95a60e8987ea5648", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"openai\" provider should show as not configured"), + "9717e19addaf865790552913a349c894", + "9d0abccf32e4285f8e31f441f15d1b72"}), "3671412adeb0a056926c6b62795e9563", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"openai\" provider should show as not configured"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "eaa9bc68e7c2d3569c2dc43b5ffae9d3", - "69b8a1b29d20d950830716da4e623889"}), "5082dd0f9bd03053927865acf48019b8", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"openai\" API key field should be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2")}), new System.Collections.Generic.List(new string[] { - "c37defe9045504518ae1187dc13102e8", - "69b8a1b29d20d950830716da4e623889"})), - new global::Io.Cucumber.Messages.Types.Pickle("93b6137f0774d155ae413f09516f9e11", "Features/Settings.feature", "Cloud providers can be configured without stored credentials", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "329ad774bfe52d539bfd3f411e44e3f1", + "9d0abccf32e4285f8e31f441f15d1b72"}), "018d74afe59b1e529399173e1737114f", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"openai\" API key field should be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4b4ce955a80fe355ba74aed9c177ee71")}), new System.Collections.Generic.List(new string[] { + "e3b48c98d19d9f55a84cda0b67cec482", + "9d0abccf32e4285f8e31f441f15d1b72"})), + new global::Io.Cucumber.Messages.Types.Pickle("b4658ab7d71ce8528edeebafda87d333", "Features/Settings.feature", "Cloud providers can be configured without stored credentials", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "46c69d9d4a6cd95ab1233f9906741bbf", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "0d24f04c510aed5488da0b55ddc15aed", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "50124a4fca991e589a7ae8e5d594a40a", + "c8d2c2782f0da55bb3f57899f9871fee"}), "06c4b28c3be0ce51bee718ee2363518e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f28d247220d3d75792c1e857110e1009", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "c74eb9621d0a5052b019ce1bc4ff741e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), + "52eae2f5d4ed2f5f9fa73cb256d2bc5e", + "c8d2c2782f0da55bb3f57899f9871fee"}), "297e5f33bdc3ea5eaf99f231dfa31992", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3becd9defc6fe15398f14bf9d75e46ac", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "db1bf95203e3a75e8dc5c01acc2578cb", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"anthropic\" as the default provider"), + "ad6c821acf3b805fb43fb0b9a02aedd3", + "c8d2c2782f0da55bb3f57899f9871fee"}), "9113b3fcd403e958a6cbe8a868d78e26", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"anthropic\" as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f431b767e44c1359876467a46b42df89", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "745d906f871a1052bc42a36a5d3971d1", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), + "2e3bff627cafa15cb77c3d14a42ad4c9", + "c8d2c2782f0da55bb3f57899f9871fee"}), "a0e388f1356e91558c91480fee67540c", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "30dc41f75e13a259a1cfb7c3326fba0f", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "8c86b58c09c7e15f891a4ce11039dae1", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), + "d23835321bc88e5fa2c715aa3e6d58ab", + "c8d2c2782f0da55bb3f57899f9871fee"}), "6a6fa6446631c75b91d1f1234d255fe2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2e5fe4df1efbce54a7285a33dcb2b417", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "c2341a5f4e666e57b83308d3f53b20cb", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), + "2f2e5f9c2e617d5aa98013183c79ccca", + "c8d2c2782f0da55bb3f57899f9871fee"}), "d1978d4fac842f5596a38cc8e56b366c", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "916f7ba42410eb55aeb78249a4e7141a", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "938983fc998dcf5ba0bcd81385751707", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast"), + "7ca52f876fce2255b82aab0945a6a733", + "c8d2c2782f0da55bb3f57899f9871fee"}), "132173573ecb9b5ea5cd552bbc020ea6", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2c0db704b0abd35596ad1316e1ebe0ea", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "1b54c4c4f7b35358b94e1cfd3fcb6ce2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), + "adc7809311ce9555b70a28a1abc77479", + "c8d2c2782f0da55bb3f57899f9871fee"}), "21ce3e6c871a1b57b23dbdddf93effb5", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e98ae53abc3f5f53901c5b2b632e2712", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "804f93e28de4a7589672385bcb2fe8d8", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "\"anthropic\" should be selected as the default provider"), + "0c1f39c3e4bcef5380c47862dc0ab926", + "c8d2c2782f0da55bb3f57899f9871fee"}), "0fdf97a5e731e153a898da34aca429be", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "\"anthropic\" should be selected as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e64bcfbff2bdea5791f9ca85ee930677", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "d39f4fffc8ec3e55aae664a4913330d1", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"anthropic\" provider should show as not configured"), + "9717e19addaf865790552913a349c894", + "c8d2c2782f0da55bb3f57899f9871fee"}), "e3a4890c3066f95682d5e3ae82b5b7cc", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"anthropic\" provider should show as not configured"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "eaa9bc68e7c2d3569c2dc43b5ffae9d3", - "b9d2e35c87d9515a80faed2da2bcc3a4"}), "9c06b622d727e455a78cc77570ccd196", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"anthropic\" API key field should be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2")}), new System.Collections.Generic.List(new string[] { - "c37defe9045504518ae1187dc13102e8", - "b9d2e35c87d9515a80faed2da2bcc3a4"})), - new global::Io.Cucumber.Messages.Types.Pickle("a7f0916c0c989956a8e3a25396833ef7", "Features/Settings.feature", "Cloud providers can be configured without stored credentials", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "329ad774bfe52d539bfd3f411e44e3f1", + "c8d2c2782f0da55bb3f57899f9871fee"}), "4e3e69d73857f6558ece061f5a5a55f0", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"anthropic\" API key field should be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4b4ce955a80fe355ba74aed9c177ee71")}), new System.Collections.Generic.List(new string[] { + "e3b48c98d19d9f55a84cda0b67cec482", + "c8d2c2782f0da55bb3f57899f9871fee"})), + new global::Io.Cucumber.Messages.Types.Pickle("bfac034834afeb5a88159057e4abfe95", "Features/Settings.feature", "Cloud providers can be configured without stored credentials", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "46c69d9d4a6cd95ab1233f9906741bbf", - "7e8d584d3c31d35688353a4d94984b88"}), "346f25c3d048e856ae8d2f002e328c9d", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "50124a4fca991e589a7ae8e5d594a40a", + "2c1b6b5b6df8da5b86c66090349012fb"}), "06a281be5812275484372b3cd9411feb", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f28d247220d3d75792c1e857110e1009", - "7e8d584d3c31d35688353a4d94984b88"}), "b196d40b58806b5d936a9b2845e1c678", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), + "52eae2f5d4ed2f5f9fa73cb256d2bc5e", + "2c1b6b5b6df8da5b86c66090349012fb"}), "a16268f0ee6cce5cbddd7c80ced7d7f3", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3becd9defc6fe15398f14bf9d75e46ac", - "7e8d584d3c31d35688353a4d94984b88"}), "3bc15515debdf459b8707f482a87649b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"huggingface\" as the default provider"), + "ad6c821acf3b805fb43fb0b9a02aedd3", + "2c1b6b5b6df8da5b86c66090349012fb"}), "5ed58445b62e205db4c97c30916399c9", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"huggingface\" as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f431b767e44c1359876467a46b42df89", - "7e8d584d3c31d35688353a4d94984b88"}), "ea206fa86c7cd158b14783c0e7cebb0f", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), + "2e3bff627cafa15cb77c3d14a42ad4c9", + "2c1b6b5b6df8da5b86c66090349012fb"}), "8a8d652aa0e0635cac490ac32e97ef95", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "30dc41f75e13a259a1cfb7c3326fba0f", - "7e8d584d3c31d35688353a4d94984b88"}), "adf0960a23a8d15cb311d53972483594", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), + "d23835321bc88e5fa2c715aa3e6d58ab", + "2c1b6b5b6df8da5b86c66090349012fb"}), "3373628aedae4559955965daaed97e43", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2e5fe4df1efbce54a7285a33dcb2b417", - "7e8d584d3c31d35688353a4d94984b88"}), "7abede722dfbe15c99b6b1f295d13680", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), + "2f2e5f9c2e617d5aa98013183c79ccca", + "2c1b6b5b6df8da5b86c66090349012fb"}), "07a360db0daea0578ff21d75a1628eb3", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "916f7ba42410eb55aeb78249a4e7141a", - "7e8d584d3c31d35688353a4d94984b88"}), "23e783c8dd44bf5bbe8a21a0c07fa6dc", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast"), + "7ca52f876fce2255b82aab0945a6a733", + "2c1b6b5b6df8da5b86c66090349012fb"}), "529358648297ff51a01ccb3165aa4cfc", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2c0db704b0abd35596ad1316e1ebe0ea", - "7e8d584d3c31d35688353a4d94984b88"}), "4699cbbf94c68c50b31c18cae70d4be6", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), + "adc7809311ce9555b70a28a1abc77479", + "2c1b6b5b6df8da5b86c66090349012fb"}), "0b3111a59b06035d9de996b3ec6511ff", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e98ae53abc3f5f53901c5b2b632e2712", - "7e8d584d3c31d35688353a4d94984b88"}), "e6b52c988fd9b7549ee1e6873617a66d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "\"huggingface\" should be selected as the default provider"), + "0c1f39c3e4bcef5380c47862dc0ab926", + "2c1b6b5b6df8da5b86c66090349012fb"}), "44fc215f86ced351bc30fce67f3957d2", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "\"huggingface\" should be selected as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "e64bcfbff2bdea5791f9ca85ee930677", - "7e8d584d3c31d35688353a4d94984b88"}), "3e01d4bc2abe4b5a9309e061f4ef124d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"huggingface\" provider should show as not configured"), + "9717e19addaf865790552913a349c894", + "2c1b6b5b6df8da5b86c66090349012fb"}), "473fc4cb3058cd55be7f4da556ab773f", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"huggingface\" provider should show as not configured"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "eaa9bc68e7c2d3569c2dc43b5ffae9d3", - "7e8d584d3c31d35688353a4d94984b88"}), "cead35a66791e15985b49c35b367479f", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"huggingface\" API key field should be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2")}), new System.Collections.Generic.List(new string[] { - "c37defe9045504518ae1187dc13102e8", - "7e8d584d3c31d35688353a4d94984b88"})), - new global::Io.Cucumber.Messages.Types.Pickle("4e4a81c9977cdd5fa9f1fbd4cc1225e5", "Features/Settings.feature", "Saved provider keys are not echoed back to the browser", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "329ad774bfe52d539bfd3f411e44e3f1", + "2c1b6b5b6df8da5b86c66090349012fb"}), "0544692ded17ee53a739172f7f985aab", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the \"huggingface\" API key field should be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4b4ce955a80fe355ba74aed9c177ee71")}), new System.Collections.Generic.List(new string[] { + "e3b48c98d19d9f55a84cda0b67cec482", + "2c1b6b5b6df8da5b86c66090349012fb"})), + new global::Io.Cucumber.Messages.Types.Pickle("e95e2195053e885a94927f8c64e480fe", "Features/Settings.feature", "Saved provider keys are not echoed back to the browser", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ea5e6caddb71cf519249f7154e9946b9"}), "08261be74d6155548fe8873ab614902c", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "03a4706908da1655bbbedbe69734582a"}), "2bff25e45f1d9154976cf6a6571e5655", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f8175a066c26cc5bab3ad05ffd8f8837"}), "708c318d13d44158a2d8096fc0ba598e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), + "ed68535539bb6d588636e73afcef8190"}), "c329234b9fd697548e2bc43d85672668", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "cc12ac1dd9575d5eb0cdfc91210c2f7b"}), "cae5d1eff1fa01598bbd9c8941bfe3cb", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I enter \"test-openai-key\" as the OpenAI API key"), + "01dcc9cd4b369f5c9e48a763b91ce8e7"}), "1a9e26b314c54b52842d15371b2acce7", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I enter \"test-openai-key\" as the OpenAI API key"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "235e4643a5d3b75fb1a1e6f43f80d3e5"}), "661b17e18866415787fa66efc894ba21", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), + "b70490fa523155579dad41749d6a27c2"}), "9c82bc0e4ff2d75598af4678ddc7a7bc", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "213429c60b5e6c58a5abda4821762f39"}), "b43c99b4d5ff1058a345f26b0f3db06d", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), + "cb2a3a61d6cd4359a0f6e85d5d2462a2"}), "2e51ad5dcf1a69538bf2ea61eb79944f", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a674ffc572b42d59baeab89ff98cfe2c"}), "e5c64cf508f9ce5a9e27e9660902607b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the OpenAI provider should show as configured"), + "47ad022eaa298b5590a1ac750db19988"}), "2126e8da6d6b545d8c34b4f02282081e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the OpenAI provider should show as configured"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "8905e1060aed4c51a5dcd53f6b2d8d12"}), "b53ec3373a6dda5fbef9a8430368c46d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the OpenAI API key field should be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "3ec55fbb8d6e3e579c7fc094e584dbc2"), - new global::Io.Cucumber.Messages.Types.PickleTag("@sensitive", "a785d55c9b7c09579c07baaaca57a95c")}), new System.Collections.Generic.List(new string[] { - "0b1b12a491d4b25e8d1dde76e534f480"}))}); + "ac5a22420f872d55a0975d9deff5b492"}), "4c43f5ecc85f415383e1607f185c1bf5", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the OpenAI API key field should be empty")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "4b4ce955a80fe355ba74aed9c177ee71"), + new global::Io.Cucumber.Messages.Types.PickleTag("@sensitive", "95b78564bf160a57a36b5132081c6eb4")}), new System.Collections.Generic.List(new string[] { + "bebbb69f2c72b85b9afb496a914bc56c"}))}); } private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() diff --git a/tests/WorkflowFramework.Dashboard.UITests/Features/Templates.feature.cs b/tests/WorkflowFramework.Dashboard.UITests/Features/Templates.feature.cs index eab4598..d9c26cd 100644 --- a/tests/WorkflowFramework.Dashboard.UITests/Features/Templates.feature.cs +++ b/tests/WorkflowFramework.Dashboard.UITests/Features/Templates.feature.cs @@ -138,71 +138,71 @@ Then I should only see template results matching ""multimodal"" private static global::Io.Cucumber.Messages.Types.GherkinDocument GherkinDocumentFunc() { return new global::Io.Cucumber.Messages.Types.GherkinDocument("Features/Templates.feature", new global::Io.Cucumber.Messages.Types.Feature(new global::Io.Cucumber.Messages.Types.Location(2, new System.Nullable(1)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "66859934bafdbc5ab12afbec7b1582c4")}), "en", "Feature", "Templates", " As a user I can create workflows from pre-built templates", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "87d39abdd6bf07538278998bd2f55808")}), "en", "Feature", "Templates", " As a user I can create workflows from pre-built templates", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), "@screenshot:template-browser", "664dacf086dc5556a2af13e22d049758")}), "Scenario", "Browse templates", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "1c2954820c237050aa0502718d2870c5"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the template browser", null, null, "06e003610152da5c8a522cb9e3905ca9"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see template categories", null, null, "286e189439edfe5cbdd087328830abd1"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see templates with difficulty badges", null, null, "3e537e35f4e7c459b407aeaddd40ba60"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see featured starter workflows", null, null, "225401315d8e3754ae80e69048efe959"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(12, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see starter preview images", null, null, "582ca44884d00e56a83e075e9f2e0911")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "8580d78c357ac65f8a6934ad1278d839")), + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), "@screenshot:template-browser", "cd841d4a72ab955b9c5941974359c3c3")}), "Scenario", "Browse templates", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "35ca033acf76f45eb3a3a03e93c90857"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the template browser", null, null, "061419d040b07a5f8d46f40b6d2f44b0"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see template categories", null, null, "0b4647d6239cd3528443cb1b00466342"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see templates with difficulty badges", null, null, "584e42ae9070bf52b2e8a876063ee7f4"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see featured starter workflows", null, null, "af089c9ad62eb85184af9f07911d3b59"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(12, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see starter preview images", null, null, "3b8864c8ac221b55adab7c2fe2ac27e8")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "1d69a0fd8af0955d85ae9e86147ee968")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Create workflow from template", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "9706736d9e99d258802cc560e01203ae"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the template browser", null, null, "98bd556086106b5ab7e0eedf8ae5e2c5"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I select a template", null, null, "7f6fb1a0924c6f56b3200175aac52735"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click \"Use This Template\"", null, null, "17eda51c64fe925c83647d3154e74c67"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "a new workflow should be created with the template steps", null, null, "0c3d4f96cac2ae509c5c4f5e845e6da9")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "f98a8b8615951450a71cba5bfedb4561")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "b6bc1f1e9cdad659a7424254ede38a47"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the template browser", null, null, "b6a28ee87c26c554af518b62cc5416d4"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I select a template", null, null, "433c1edf2b0b8b5c93b11616b85c4cd7"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click \"Use This Template\"", null, null, "d8a56017374e4a5eb6650fb26c64e5da"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "a new workflow should be created with the template steps", null, null, "335fc7a174cc965581bd06351c7c41c2")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "989465568f9f7d57b0f78676bb16aee2")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Filter templates by search", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "a3c0211b55cc2258b9ae0d9cc62cd65e"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the template browser", null, null, "69b73b00ea14b25ea2ea5bb7ddccae83"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I search templates for \"multimodal\"", null, null, "bee97f878d345b5c895fcc82afb1458a"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should only see template results matching \"multimodal\"", null, null, "760189c12a9d0a52885f936356c8e1e8")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "5f7cb38fb7adad5e93307f2fef8d6e10"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "ca14148a1de0915da37c1ec7512ac4de"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I open the template browser", null, null, "bbbdf0892f2dfa5e8d0ed1eace40a02d"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I search templates for \"multimodal\"", null, null, "92822674a5e5dc54be4b4e0505b816e1"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should only see template results matching \"multimodal\"", null, null, "2123642b94e6785b988f455e36060407")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "0e1783685c23925093bda4bb370a1fa7"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); } private static global::System.Collections.Generic.IEnumerable PicklesFunc() { return new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Pickle[] { - new global::Io.Cucumber.Messages.Types.Pickle("683b96264b83cb57ba315b35ba065a18", "Features/Templates.feature", "Browse templates", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + new global::Io.Cucumber.Messages.Types.Pickle("08836595415587538d2bfb3747d9bc29", "Features/Templates.feature", "Browse templates", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "1c2954820c237050aa0502718d2870c5"}), "174290ac0069dc5498bfc02d8eb54c52", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "35ca033acf76f45eb3a3a03e93c90857"}), "50a27173ef6cc950b484b30464918e07", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "06e003610152da5c8a522cb9e3905ca9"}), "e7cc61bbd402d05e8300039a28943302", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the template browser"), + "061419d040b07a5f8d46f40b6d2f44b0"}), "87b1f21accbed25a9a195bfc08d2caea", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the template browser"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "286e189439edfe5cbdd087328830abd1"}), "a4f9ed8a97fffa5383c068c5e83a799a", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see template categories"), + "0b4647d6239cd3528443cb1b00466342"}), "d68df94937fc8b5e99ba3da80d5d1deb", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see template categories"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3e537e35f4e7c459b407aeaddd40ba60"}), "c6a446078f8d2355a9ea17227eb2f29b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see templates with difficulty badges"), + "584e42ae9070bf52b2e8a876063ee7f4"}), "f6ebeebaccd6325aac59fcfe004cc7a3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see templates with difficulty badges"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "225401315d8e3754ae80e69048efe959"}), "6f62f269078eeb5fb2db60e9784c4806", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see featured starter workflows"), + "af089c9ad62eb85184af9f07911d3b59"}), "8d49e858bf102956b680a5c9e51d7634", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see featured starter workflows"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "582ca44884d00e56a83e075e9f2e0911"}), "8f449b9b9ec79c5c8b03df633b06bade", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see starter preview images")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "66859934bafdbc5ab12afbec7b1582c4"), - new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:template-browser", "664dacf086dc5556a2af13e22d049758")}), new System.Collections.Generic.List(new string[] { - "8580d78c357ac65f8a6934ad1278d839"})), - new global::Io.Cucumber.Messages.Types.Pickle("f8edd9414177105ba8c4a33561a8fbff", "Features/Templates.feature", "Create workflow from template", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "3b8864c8ac221b55adab7c2fe2ac27e8"}), "75a9f47c5068005387f330e559cae1f3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see starter preview images")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "87d39abdd6bf07538278998bd2f55808"), + new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:template-browser", "cd841d4a72ab955b9c5941974359c3c3")}), new System.Collections.Generic.List(new string[] { + "1d69a0fd8af0955d85ae9e86147ee968"})), + new global::Io.Cucumber.Messages.Types.Pickle("dbc697e70f75795c8844f0e05a7b2cf7", "Features/Templates.feature", "Create workflow from template", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "9706736d9e99d258802cc560e01203ae"}), "b951da1768bb5d50a4720d140292b84e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "b6bc1f1e9cdad659a7424254ede38a47"}), "15ce195f7e2f2f58ba008db8f24b1a65", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "98bd556086106b5ab7e0eedf8ae5e2c5"}), "a544f098088c8c57be778264847b5b18", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the template browser"), + "b6a28ee87c26c554af518b62cc5416d4"}), "5987953e5515cf50b4b1f2948f5b7725", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the template browser"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7f6fb1a0924c6f56b3200175aac52735"}), "f7a310d8f7c6a55292d01be321493e76", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a template"), + "433c1edf2b0b8b5c93b11616b85c4cd7"}), "34f5017cbd73db569863f5a54e6a85a8", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a template"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "17eda51c64fe925c83647d3154e74c67"}), "8de73609906ccd5dbd4816e2bd89e76d", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click \"Use This Template\""), + "d8a56017374e4a5eb6650fb26c64e5da"}), "44b1ee501d9b0b57bf4bb26feaea0cc4", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click \"Use This Template\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "0c3d4f96cac2ae509c5c4f5e845e6da9"}), "e660b39c9a3b6d549189191d1621b34f", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "a new workflow should be created with the template steps")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "66859934bafdbc5ab12afbec7b1582c4")}), new System.Collections.Generic.List(new string[] { - "f98a8b8615951450a71cba5bfedb4561"})), - new global::Io.Cucumber.Messages.Types.Pickle("045cf54c6cbe4e538023801e819b8142", "Features/Templates.feature", "Filter templates by search", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "335fc7a174cc965581bd06351c7c41c2"}), "cf6da1d7d7011e57aa491f15ad83a17d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "a new workflow should be created with the template steps")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "87d39abdd6bf07538278998bd2f55808")}), new System.Collections.Generic.List(new string[] { + "989465568f9f7d57b0f78676bb16aee2"})), + new global::Io.Cucumber.Messages.Types.Pickle("c1fb7f67f4dd505caec636edf486be8c", "Features/Templates.feature", "Filter templates by search", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a3c0211b55cc2258b9ae0d9cc62cd65e"}), "95bf505a6be6ff5fbd1abb6fa114acf6", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "ca14148a1de0915da37c1ec7512ac4de"}), "ea3adec5b8640f579cf98bc9bfe5a3cf", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "69b73b00ea14b25ea2ea5bb7ddccae83"}), "f5fe50cdbc99275fa5990c2a1a9c0822", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the template browser"), + "bbbdf0892f2dfa5e8d0ed1eace40a02d"}), "7e70416d69ff3c51bcec3e979342f495", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the template browser"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "bee97f878d345b5c895fcc82afb1458a"}), "cdea6f6a4349705facec9756b6bd2b60", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I search templates for \"multimodal\""), + "92822674a5e5dc54be4b4e0505b816e1"}), "5c06c460ad366451a604e235848259bf", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I search templates for \"multimodal\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "760189c12a9d0a52885f936356c8e1e8"}), "38a2e484ed3bf556b48b56479fc7a172", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should only see template results matching \"multimodal\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "66859934bafdbc5ab12afbec7b1582c4")}), new System.Collections.Generic.List(new string[] { - "5f7cb38fb7adad5e93307f2fef8d6e10"}))}); + "2123642b94e6785b988f455e36060407"}), "6fef82064a95df52bfead51d5ad81a25", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should only see template results matching \"multimodal\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "87d39abdd6bf07538278998bd2f55808")}), new System.Collections.Generic.List(new string[] { + "0e1783685c23925093bda4bb370a1fa7"}))}); } private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() diff --git a/tests/WorkflowFramework.Dashboard.UITests/Features/WorkflowDesigner.feature.cs b/tests/WorkflowFramework.Dashboard.UITests/Features/WorkflowDesigner.feature.cs index 20fa0ea..37b6cf7 100644 --- a/tests/WorkflowFramework.Dashboard.UITests/Features/WorkflowDesigner.feature.cs +++ b/tests/WorkflowFramework.Dashboard.UITests/Features/WorkflowDesigner.feature.cs @@ -107,132 +107,153 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo, globa private static global::Io.Cucumber.Messages.Types.Source SourceFunc() { - return new global::Io.Cucumber.Messages.Types.Source("Features/WorkflowDesigner.feature", "@UI\r\nFeature: Workflow Designer\r\n As a user I can visually design workflows usin" + - "g the drag-and-drop designer\r\n\r\n @screenshot:designer-overview\r\n Scenario: Vie" + - "w empty designer on launch\r\n Given the dashboard is running\r\n When I navig" + - "ate to the designer\r\n Then I should see the step palette on the left\r\n And" + - " I should see an empty canvas\r\n And I should see the properties panel on the " + - "right\r\n\r\n @screenshot:step-palette\r\n Scenario: Search step palette\r\n Given " + - "the dashboard is running\r\n When I navigate to the designer\r\n And I type \"c" + - "onditional\" in the step search\r\n Then I should see filtered steps containing " + - "\"conditional\"\r\n\r\n @screenshot:properties-panel\r\n Scenario: Select a node and v" + - "iew properties\r\n Given the dashboard is running\r\n And I have a workflow wi" + - "th an action step\r\n When I click on the action step node\r\n Then the proper" + - "ties panel should show the step configuration\r\n\r\n Scenario: SubWorkflow step sh" + - "ows saved workflow suggestions\r\n Given the dashboard is running\r\n And I ha" + - "ve a workflow with a SubWorkflow step\r\n When I select the SubWorkflow step\r\n " + - " Then the properties panel should show saved workflow suggestions including \"C" + - "hild Flow\"\r\n When I choose saved workflow \"Child Flow\"\r\n Then the SubWorkf" + - "low reference should be \"Child Flow\"\r\n\r\n @screenshot:toolbar\r\n Scenario: View " + - "toolbar\r\n Given the dashboard is running\r\n When I navigate to the designer" + - "\r\n Then the toolbar should show save, run, validate, and settings buttons\r\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); + return new global::Io.Cucumber.Messages.Types.Source("Features/WorkflowDesigner.feature", @"@UI +Feature: Workflow Designer + As a user I can visually design workflows using the drag-and-drop designer + + @screenshot:designer-overview + Scenario: View empty designer on launch + Given the dashboard is running + When I navigate to the designer + Then I should see the step palette on the left + And I should see an empty canvas + And I should see the properties panel on the right + + @screenshot:step-palette + Scenario: Search step palette + Given the dashboard is running + When I navigate to the designer + And I type ""conditional"" in the step search + Then I should see filtered steps containing ""conditional"" + + @screenshot:properties-panel + Scenario: Select a node and view properties + Given the dashboard is running + And I have a workflow with an action step + When I click on the action step node + Then the properties panel should show the step configuration + + Scenario: SubWorkflow step shows saved workflow suggestions + Given the dashboard is running + And I have a workflow with a SubWorkflow step + When I select the SubWorkflow step + Then the properties panel should show saved workflow suggestions including ""Child Flow"" + When I choose saved workflow ""Child Flow"" + Then the SubWorkflow reference should be ""Child Flow"" + + @screenshot:toolbar + Scenario: View toolbar + Given the dashboard is running + When I navigate to the designer + Then the toolbar should show save, run, validate, and settings buttons +", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); } private static global::Io.Cucumber.Messages.Types.GherkinDocument GherkinDocumentFunc() { return new global::Io.Cucumber.Messages.Types.GherkinDocument("Features/WorkflowDesigner.feature", new global::Io.Cucumber.Messages.Types.Feature(new global::Io.Cucumber.Messages.Types.Location(2, new System.Nullable(1)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "5077795886aa815999c714bbac21d117")}), "en", "Feature", "Workflow Designer", " As a user I can visually design workflows using the drag-and-drop designer", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "421b6e9205620d538bdc0821ee7b8650")}), "en", "Feature", "Workflow Designer", " As a user I can visually design workflows using the drag-and-drop designer", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), "@screenshot:designer-overview", "86301e5a71900f5286a466cefe5f0cad")}), "Scenario", "View empty designer on launch", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "bfb2e2a5f3a4985298e293504aa916b2"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I navigate to the designer", null, null, "c944185f85521851a0111d5d7ef298b4"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see the step palette on the left", null, null, "4e554c9b6e37685bbfcbb67c523aa99b"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see an empty canvas", null, null, "8bfcbec6ab15dc5fb53f5ca62832dad1"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see the properties panel on the right", null, null, "f041f8ff9fe3db5a9d608abf9313f3cb")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "f734b9708789ac53b825740d69076aee")), + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), "@screenshot:designer-overview", "5b3211a45c8e945f9ae6abf18c426910")}), "Scenario", "View empty designer on launch", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "446265111b2951588dcf0a464f4dea58"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I navigate to the designer", null, null, "e5fcb51f60fd0b5ebaf0edcb56683a49"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see the step palette on the left", null, null, "18fc6659bc9dbc5c91246994b063774f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see an empty canvas", null, null, "1cdf9b1fc1c89451a987f04e313f6c91"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see the properties panel on the right", null, null, "c860c4a9a8a68f519a1f20fff99c080b")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "40c777c13229ef588d80742916815b1a")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(3)), "@screenshot:step-palette", "1ca4b7a55237ae54917e070670cec299")}), "Scenario", "Search step palette", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "153926eab3b6a85b9fabb62c7a40840f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I navigate to the designer", null, null, "ff2a7898adc8f05c97190acc0415e40e"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I type \"conditional\" in the step search", null, null, "181112cbb9a13150962cd9ce530d9efb"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see filtered steps containing \"conditional\"", null, null, "06e9d466cd62255baa9be9441ad3ad49")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "4e8fa8d0ace62e57873a97a378c1b796")), + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(3)), "@screenshot:step-palette", "35140d9a766922599af91f0f87a0d97a")}), "Scenario", "Search step palette", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "2d4e2882db2cda578bc931bfd8d7a434"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I navigate to the designer", null, null, "569e310f1ee19150a3caa507b53abbb9"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I type \"conditional\" in the step search", null, null, "746ac995e3b46f51826a13ca4486050b"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see filtered steps containing \"conditional\"", null, null, "89760381a03998539b990acf5d608441")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "b0624e9871af1b579aaac075a77f799f")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(3)), "@screenshot:properties-panel", "cc5a026595eaad57b43884e59a18cb5c")}), "Scenario", "Select a node and view properties", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "d4925314f3dfe75c82b9593a7eb05973"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an action step", null, null, "799f3356cb984c58b1932c3b89093279"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I click on the action step node", null, null, "8bc3434059dfb451acaa031adc239536"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show the step configuration", null, null, "41b7f57a935ae75ab3eab36a7f302282")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "255b4e2cfbb2335c8f07b84290cf9ef9")), + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(3)), "@screenshot:properties-panel", "c6581724e852785c8bddfe0d2e5605d9")}), "Scenario", "Select a node and view properties", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "ab4bda08bcb6b351856b1c3258051d8a"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an action step", null, null, "38c205b734140c5cb03e4d33d18377f7"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I click on the action step node", null, null, "5ea375f9a9af7f53b0cbb427e737cd06"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show the step configuration", null, null, "e5a9ac555dde615fb9385d336ed1c20f")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "619b1071a6c70b528bf9d17d7eac0624")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(27, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "SubWorkflow step shows saved workflow suggestions", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "0a0b84cc33092d599dfdee7b3ada4ad0"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(29, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with a SubWorkflow step", null, null, "4c70be0bfb92ef598f42cc7c2ddad7ed"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the SubWorkflow step", null, null, "1833bf9553841f55af7dd82ec001ef4e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "172337482025ec5fa67c4c56cbd4c009"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(29, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with a SubWorkflow step", null, null, "6a3e72d0916dff50ab2a15a4e2128894"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select the SubWorkflow step", null, null, "3c8018f3be628c5cb86c4f19e6ddee16"), new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the properties panel should show saved workflow suggestions including \"Child Flow" + - "\"", null, null, "d9e7d8a53315b95e8cf6b1029a975434"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I choose saved workflow \"Child Flow\"", null, null, "3ede92de8c3f2658959d7ce0b5041075"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the SubWorkflow reference should be \"Child Flow\"", null, null, "02b9101ca6c3ba5297db7378d85209fe")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "e129b1a85b859c5e81343525218f0325")), + "\"", null, null, "434d54e4c38c8753b69b3b22dab53c12"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(32, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I choose saved workflow \"Child Flow\"", null, null, "f5bf4353e983c5549eb9229c415fa761"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the SubWorkflow reference should be \"Child Flow\"", null, null, "d507151b1baed95e8c6bd8a1e67f1ac9")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "3ff08edc5aeaed518464cd3990ed8fe6")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(3)), "@screenshot:toolbar", "1c151db2e7dc3c59ba53247790dd45d9")}), "Scenario", "View toolbar", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(37, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "b6895791d0fe4a5da769ad3954accbb5"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(38, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I navigate to the designer", null, null, "01c3739309bc435d8f167a017cb10336"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(39, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the toolbar should show save, run, validate, and settings buttons", null, null, "78ade72c7a1d6251b0f5e6efdc960bb8")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "70bb9893ba216559a27ba0b5dee71d57"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(3)), "@screenshot:toolbar", "a60703f941de585a826205f006410ac6")}), "Scenario", "View toolbar", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(37, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "b620b1353519075499d43ab51e273e9f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(38, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I navigate to the designer", null, null, "2046e9a624851b58a78c91ba6bab121f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(39, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the toolbar should show save, run, validate, and settings buttons", null, null, "874ad90357065059a949df96579a92eb")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "f43b40b1c6cccb5daee7a0bf9739d060"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); } private static global::System.Collections.Generic.IEnumerable PicklesFunc() { return new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Pickle[] { - new global::Io.Cucumber.Messages.Types.Pickle("03ddad326dab2a5181da01e1e97dc8cf", "Features/WorkflowDesigner.feature", "View empty designer on launch", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + new global::Io.Cucumber.Messages.Types.Pickle("657f1d766fcae752b3002d67b46813a4", "Features/WorkflowDesigner.feature", "View empty designer on launch", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "bfb2e2a5f3a4985298e293504aa916b2"}), "4b181d993827a95ba244c56eb07ccdbd", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "446265111b2951588dcf0a464f4dea58"}), "8530e183472b98578f9150d67a724346", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "c944185f85521851a0111d5d7ef298b4"}), "02a5d3669cb879529e9f9ac889aedf32", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I navigate to the designer"), + "e5fcb51f60fd0b5ebaf0edcb56683a49"}), "eae7f211a1482356b02286ed219e6da2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I navigate to the designer"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4e554c9b6e37685bbfcbb67c523aa99b"}), "21820eccd5636959bb6728f97dd6608b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the step palette on the left"), + "18fc6659bc9dbc5c91246994b063774f"}), "ead427b5d484d45eab3420b0c88dcc55", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the step palette on the left"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "8bfcbec6ab15dc5fb53f5ca62832dad1"}), "b94da4127ed467518c235a1dddf9689b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see an empty canvas"), + "1cdf9b1fc1c89451a987f04e313f6c91"}), "4b780eafe31fa455b0c42895c26e9877", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see an empty canvas"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f041f8ff9fe3db5a9d608abf9313f3cb"}), "f12088596c22f157a93e9edea7391a87", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the properties panel on the right")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "5077795886aa815999c714bbac21d117"), - new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:designer-overview", "86301e5a71900f5286a466cefe5f0cad")}), new System.Collections.Generic.List(new string[] { - "f734b9708789ac53b825740d69076aee"})), - new global::Io.Cucumber.Messages.Types.Pickle("6ac818c315e24f5c9bc2e26428794944", "Features/WorkflowDesigner.feature", "Search step palette", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "c860c4a9a8a68f519a1f20fff99c080b"}), "16ba992214db1d509e4edc415df634d5", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see the properties panel on the right")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "421b6e9205620d538bdc0821ee7b8650"), + new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:designer-overview", "5b3211a45c8e945f9ae6abf18c426910")}), new System.Collections.Generic.List(new string[] { + "40c777c13229ef588d80742916815b1a"})), + new global::Io.Cucumber.Messages.Types.Pickle("1318e116a5b8c4538d1c605ad9ccc162", "Features/WorkflowDesigner.feature", "Search step palette", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "153926eab3b6a85b9fabb62c7a40840f"}), "64440775282d9d5aac86bd79788e90d2", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "2d4e2882db2cda578bc931bfd8d7a434"}), "8ed8b537b28c24578c00a98056a75884", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ff2a7898adc8f05c97190acc0415e40e"}), "518bf60d3a00af53aa93bccda0005e0b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I navigate to the designer"), + "569e310f1ee19150a3caa507b53abbb9"}), "7f08b116ad4a495ab0396fd1ba4fdd7a", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I navigate to the designer"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "181112cbb9a13150962cd9ce530d9efb"}), "2c5ce00e4597195fa2ce78d39bc696f8", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I type \"conditional\" in the step search"), + "746ac995e3b46f51826a13ca4486050b"}), "860bc7d248d37c5198c83ba8100654f4", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I type \"conditional\" in the step search"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "06e9d466cd62255baa9be9441ad3ad49"}), "847481c28452605a818aae573bae7ed3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see filtered steps containing \"conditional\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "5077795886aa815999c714bbac21d117"), - new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:step-palette", "1ca4b7a55237ae54917e070670cec299")}), new System.Collections.Generic.List(new string[] { - "4e8fa8d0ace62e57873a97a378c1b796"})), - new global::Io.Cucumber.Messages.Types.Pickle("ea5a6c3be15fd351b20809e6a7a98c87", "Features/WorkflowDesigner.feature", "Select a node and view properties", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "89760381a03998539b990acf5d608441"}), "00a75a707f489f5d94abf0f937ac4fba", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see filtered steps containing \"conditional\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "421b6e9205620d538bdc0821ee7b8650"), + new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:step-palette", "35140d9a766922599af91f0f87a0d97a")}), new System.Collections.Generic.List(new string[] { + "b0624e9871af1b579aaac075a77f799f"})), + new global::Io.Cucumber.Messages.Types.Pickle("d4c3d0f257c7b45388c1efc4eb9a673b", "Features/WorkflowDesigner.feature", "Select a node and view properties", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "d4925314f3dfe75c82b9593a7eb05973"}), "c781966b4f9d2653bc14577b3e54b4ab", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "ab4bda08bcb6b351856b1c3258051d8a"}), "8e48f39aa85f6750a7ca31dc881d54ee", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "799f3356cb984c58b1932c3b89093279"}), "c7abb84d82c5c950b61554c835882c28", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an action step"), + "38c205b734140c5cb03e4d33d18377f7"}), "dd578d09aa377359b7723c5320cbc806", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an action step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "8bc3434059dfb451acaa031adc239536"}), "71316ce5bb6e7c50af863efb8c700a28", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click on the action step node"), + "5ea375f9a9af7f53b0cbb427e737cd06"}), "820de3e8267d1054baa05c9aab1dc3bc", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click on the action step node"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "41b7f57a935ae75ab3eab36a7f302282"}), "45cf814f8318b354954a6f8d38977fad", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show the step configuration")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "5077795886aa815999c714bbac21d117"), - new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:properties-panel", "cc5a026595eaad57b43884e59a18cb5c")}), new System.Collections.Generic.List(new string[] { - "255b4e2cfbb2335c8f07b84290cf9ef9"})), - new global::Io.Cucumber.Messages.Types.Pickle("d0ee74788f9fb25781ff15536c52cfe8", "Features/WorkflowDesigner.feature", "SubWorkflow step shows saved workflow suggestions", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "e5a9ac555dde615fb9385d336ed1c20f"}), "26e321614619045089dc0f1ee422657e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show the step configuration")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "421b6e9205620d538bdc0821ee7b8650"), + new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:properties-panel", "c6581724e852785c8bddfe0d2e5605d9")}), new System.Collections.Generic.List(new string[] { + "619b1071a6c70b528bf9d17d7eac0624"})), + new global::Io.Cucumber.Messages.Types.Pickle("3510aceded97d258b4d394be8e02dea8", "Features/WorkflowDesigner.feature", "SubWorkflow step shows saved workflow suggestions", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "0a0b84cc33092d599dfdee7b3ada4ad0"}), "95da292353b648598a70384878d75ad9", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "172337482025ec5fa67c4c56cbd4c009"}), "1ff3b83e99c9c6578ab51e160487145f", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "4c70be0bfb92ef598f42cc7c2ddad7ed"}), "f064eabc2e4fd2529b7fb94df82ca20f", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with a SubWorkflow step"), + "6a3e72d0916dff50ab2a15a4e2128894"}), "4f97ff288cb36e5cabb045f15e00fe6f", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with a SubWorkflow step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "1833bf9553841f55af7dd82ec001ef4e"}), "644ea6ec348ac153ab058b567ba1840f", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the SubWorkflow step"), + "3c8018f3be628c5cb86c4f19e6ddee16"}), "db09bbeb135c0a5397646f8f5f344c71", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select the SubWorkflow step"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "d9e7d8a53315b95e8cf6b1029a975434"}), "3fe64fc703beb057ba640fa3716beae3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show saved workflow suggestions including \"Child Flow" + + "434d54e4c38c8753b69b3b22dab53c12"}), "19b41c77b19a9352bc21bf0dd5e4ba45", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the properties panel should show saved workflow suggestions including \"Child Flow" + "\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3ede92de8c3f2658959d7ce0b5041075"}), "bb71b3430e3e3f578d58739d5900982b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I choose saved workflow \"Child Flow\""), + "f5bf4353e983c5549eb9229c415fa761"}), "fd763194ca71a155bd7850829f5bc907", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I choose saved workflow \"Child Flow\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "02b9101ca6c3ba5297db7378d85209fe"}), "17ebdd9bc9b47658b7bbc14bcdaf5bd5", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the SubWorkflow reference should be \"Child Flow\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "5077795886aa815999c714bbac21d117")}), new System.Collections.Generic.List(new string[] { - "e129b1a85b859c5e81343525218f0325"})), - new global::Io.Cucumber.Messages.Types.Pickle("ead7fb3a365807559894e28b931a479f", "Features/WorkflowDesigner.feature", "View toolbar", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "d507151b1baed95e8c6bd8a1e67f1ac9"}), "f019f76ba107b05d93b69846074aa8a7", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the SubWorkflow reference should be \"Child Flow\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "421b6e9205620d538bdc0821ee7b8650")}), new System.Collections.Generic.List(new string[] { + "3ff08edc5aeaed518464cd3990ed8fe6"})), + new global::Io.Cucumber.Messages.Types.Pickle("94da8f3b28a06155bc4c4b7a01bf877e", "Features/WorkflowDesigner.feature", "View toolbar", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "b6895791d0fe4a5da769ad3954accbb5"}), "77c2fe0b70e34750afb5a005ff352877", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "b620b1353519075499d43ab51e273e9f"}), "d432d6e26a57e453816c8386532f7b5b", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "01c3739309bc435d8f167a017cb10336"}), "5d5f17df40cc5a59834862ff2c72f3ec", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I navigate to the designer"), + "2046e9a624851b58a78c91ba6bab121f"}), "ae69be88c7975759a9fbd7fd693f5e6f", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I navigate to the designer"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "78ade72c7a1d6251b0f5e6efdc960bb8"}), "55cb2f3f1968b05f9e144ba7e9272092", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the toolbar should show save, run, validate, and settings buttons")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "5077795886aa815999c714bbac21d117"), - new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:toolbar", "1c151db2e7dc3c59ba53247790dd45d9")}), new System.Collections.Generic.List(new string[] { - "70bb9893ba216559a27ba0b5dee71d57"}))}); + "874ad90357065059a949df96579a92eb"}), "00679e5a0bab825480635bfe74f6260b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the toolbar should show save, run, validate, and settings buttons")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "421b6e9205620d538bdc0821ee7b8650"), + new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:toolbar", "a60703f941de585a826205f006410ac6")}), new System.Collections.Generic.List(new string[] { + "f43b40b1c6cccb5daee7a0bf9739d060"}))}); } private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() diff --git a/tests/WorkflowFramework.Dashboard.UITests/Features/WorkflowExecution.feature.cs b/tests/WorkflowFramework.Dashboard.UITests/Features/WorkflowExecution.feature.cs index 85650ee..2c2cf01 100644 --- a/tests/WorkflowFramework.Dashboard.UITests/Features/WorkflowExecution.feature.cs +++ b/tests/WorkflowFramework.Dashboard.UITests/Features/WorkflowExecution.feature.cs @@ -107,214 +107,214 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo, globa private static global::Io.Cucumber.Messages.Types.Source SourceFunc() { - return new global::Io.Cucumber.Messages.Types.Source("Features/WorkflowExecution.feature", "@UI\r\nFeature: Workflow Execution Deep\r\n Workflows execute with real step process" + - "ing and live progress\r\n\r\n Scenario: Run Hello World workflow end-to-end\r\n Gi" + - "ven the dashboard is running\r\n And I open the \"Hello World\" sample workflow\r\n" + - " When I save and run the workflow\r\n Then the execution panel should show \"" + - "Running\"\r\n And I should see step progress updates\r\n And the run should com" + - "plete with status \"Completed\"\r\n\r\n @local-ollama @screenshot:ollama-local-run\r\n " + - " Scenario: Run local Ollama workflow end-to-end\r\n Given the dashboard is runn" + - "ing\r\n And I am on the settings page\r\n When I set the Ollama URL to \"http:/" + - "/localhost:11434\"\r\n And I select \"ollama\" as the default provider\r\n Then t" + - "he model dropdown should be populated\r\n When I select a model\r\n And I clic" + - "k Save Settings\r\n Then I should see a success toast\r\n When I reload the se" + - "ttings page\r\n Then \"ollama\" should be selected as the default provider\r\n W" + - "hen I navigate to the designer\r\n And I open the \"Local Ollama Smoke Test\" sam" + - "ple workflow\r\n And I save and run the workflow\r\n Then the execution panel " + - "should show \"Running\"\r\n And I should see step progress updates\r\n And the r" + - "un should complete with status \"Completed\"\r\n And the latest run for the curre" + - "nt workflow should include an AI response from step \"GenerateLocalReply\"\r\n\r\n Sc" + - "enario: Run HTTP workflow makes real requests\r\n Given the dashboard is runnin" + - "g\r\n And I open the \"HTTP API Orchestration\" sample workflow\r\n When I save " + - "and run the workflow\r\n Then I should see step \"FetchUserData\" complete\r\n A" + - "nd I should see step \"FetchUserPosts\" complete\r\n And the run should complete " + - "with status \"Completed\"\r\n\r\n Scenario: Cancel a running workflow\r\n Given the " + - "dashboard is running\r\n And I have a workflow with a Delay step of 30000ms\r\n " + - " When I save and run the workflow\r\n And the workflow is running\r\n When I " + - "cancel the run\r\n Then the run should show status \"Cancelled\"\r\n\r\n Scenario: F" + - "ailed step shows error in output\r\n Given the dashboard is running\r\n And I " + - "have a workflow with an HttpStep pointing to an invalid URL\r\n When I save and" + - " run the workflow\r\n Then I should see a step failure in the output panel\r\n " + - " And the run should complete with status \"Failed\"\r\n\r\n Scenario: View run in his" + - "tory after completion\r\n Given the dashboard is running\r\n And I open the \"H" + - "ello World\" sample workflow\r\n When I save and run the workflow\r\n And the r" + - "un completes\r\n Then the run should appear in the runs list via API\r\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); + return new global::Io.Cucumber.Messages.Types.Source("Features/WorkflowExecution.feature", "@UI\nFeature: Workflow Execution Deep\n Workflows execute with real step processin" + + "g and live progress\n\n Scenario: Run Hello World workflow end-to-end\n Given t" + + "he dashboard is running\n And I open the \"Hello World\" sample workflow\n Whe" + + "n I save and run the workflow\n Then the execution panel should show \"Running\"" + + "\n And I should see step progress updates\n And the run should complete with" + + " status \"Completed\"\n\n @local-ollama @screenshot:ollama-local-run\n Scenario: Ru" + + "n local Ollama workflow end-to-end\n Given the dashboard is running\n And I " + + "am on the settings page\n When I set the Ollama URL to \"http://localhost:11434" + + "\"\n And I select \"ollama\" as the default provider\n Then the model dropdown " + + "should be populated\n When I select a model\n And I click Save Settings\n " + + "Then I should see a success toast\n When I reload the settings page\n Then \"" + + "ollama\" should be selected as the default provider\n When I navigate to the de" + + "signer\n And I open the \"Local Ollama Smoke Test\" sample workflow\n And I sa" + + "ve and run the workflow\n Then the execution panel should show \"Running\"\n A" + + "nd I should see step progress updates\n And the run should complete with statu" + + "s \"Completed\"\n And the latest run for the current workflow should include an " + + "AI response from step \"GenerateLocalReply\"\n\n Scenario: Run HTTP workflow makes " + + "real requests\n Given the dashboard is running\n And I open the \"HTTP API Or" + + "chestration\" sample workflow\n When I save and run the workflow\n Then I sho" + + "uld see step \"FetchUserData\" complete\n And I should see step \"FetchUserPosts\"" + + " complete\n And the run should complete with status \"Completed\"\n\n Scenario: C" + + "ancel a running workflow\n Given the dashboard is running\n And I have a wor" + + "kflow with a Delay step of 30000ms\n When I save and run the workflow\n And " + + "the workflow is running\n When I cancel the run\n Then the run should show s" + + "tatus \"Cancelled\"\n\n Scenario: Failed step shows error in output\n Given the d" + + "ashboard is running\n And I have a workflow with an HttpStep pointing to an in" + + "valid URL\n When I save and run the workflow\n Then I should see a step fail" + + "ure in the output panel\n And the run should complete with status \"Failed\"\n\n " + + "Scenario: View run in history after completion\n Given the dashboard is runnin" + + "g\n And I open the \"Hello World\" sample workflow\n When I save and run the w" + + "orkflow\n And the run completes\n Then the run should appear in the runs lis" + + "t via API\n", global::Io.Cucumber.Messages.Types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN); } private static global::Io.Cucumber.Messages.Types.GherkinDocument GherkinDocumentFunc() { return new global::Io.Cucumber.Messages.Types.GherkinDocument("Features/WorkflowExecution.feature", new global::Io.Cucumber.Messages.Types.Feature(new global::Io.Cucumber.Messages.Types.Location(2, new System.Nullable(1)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "6814785dc9a39e55949a5fc8a9a2c7e9")}), "en", "Feature", "Workflow Execution Deep", " Workflows execute with real step processing and live progress", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(1, new System.Nullable(1)), "@UI", "61e849543b48455e911e66807f650fca")}), "en", "Feature", "Workflow Execution Deep", " Workflows execute with real step processing and live progress", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.FeatureChild[] { new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(5, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Run Hello World workflow end-to-end", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "d82ca96ed6e5b958a32faa9ba0196f87"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Hello World\" sample workflow", null, null, "77184009713e2258847da4a57a08871c"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "d24b77addd5e1052a390ce6764aa1520"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the execution panel should show \"Running\"", null, null, "3c5986a16e55085aa02269976160736b"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see step progress updates", null, null, "f002c63f4e5a8c5da1948cc96a37cfef"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run should complete with status \"Completed\"", null, null, "2fc09aada0cd4c5c8be06d1e29c283b1")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "871bc1e828d23b5ba7effa1ad259e4b2")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(6, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "c717ab0adbd42551acdc167c02074261"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(7, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Hello World\" sample workflow", null, null, "74c3e5965d79aa5ea1c2c8b59cc16098"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(8, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "f5040d5a4620f05785f23103bb6916e0"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(9, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the execution panel should show \"Running\"", null, null, "e23500056b242654923d37af377288df"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(10, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see step progress updates", null, null, "ee51452a2c58f75c8b422098e096b398"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(11, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run should complete with status \"Completed\"", null, null, "6fdf0f9e456fcb5d8a634da0e116309c")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "2d8561d05a4aa65983fa9e4d774a503f")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(14, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[] { - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(3)), "@local-ollama", "3eb075ac61dc0b5bb623ad970f5a3da4"), - new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(17)), "@screenshot:ollama-local-run", "daee9dba130d01539479f363ec1614f3")}), "Scenario", "Run local Ollama workflow end-to-end", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "840c6bc37277375ba065e2d69f9e15c2"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "aed5c4eccf2f5957bd17e1746be2e2d8"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I set the Ollama URL to \"http://localhost:11434\"", null, null, "900e9ef36ee56555af265b9259ac5f60"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I select \"ollama\" as the default provider", null, null, "6787a3bcb78f825dbcf0692a98164b6d"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the model dropdown should be populated", null, null, "21ea71e93e6236568db0fd42aa04e52d"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select a model", null, null, "8f0f175e25646757b75bbbb84d1af392"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "1b87b298a6922e539e8a637d8d725771"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a success toast", null, null, "10f224a7ae83bf5b952a285df9b38ca3"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I reload the settings page", null, null, "b87983604002515d82c1f8d828ae4149"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "\"ollama\" should be selected as the default provider", null, null, "fdb0d18fe9342e5683f246474f2e4d07"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I navigate to the designer", null, null, "c6d7ffb6eece795daa79cfc1009defe8"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(26, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Local Ollama Smoke Test\" sample workflow", null, null, "468564f729e9a959984faefcffd9a7d3"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(27, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I save and run the workflow", null, null, "a7821787ed44f053862ce22b4025d094"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the execution panel should show \"Running\"", null, null, "808cc452062c645483fbea9b752a257c"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(29, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see step progress updates", null, null, "cefd731ea90da95bbdb0465784c58167"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run should complete with status \"Completed\"", null, null, "bcce9334798d9054a27829ddf7a032a5"), + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(3)), "@local-ollama", "5b14c39fd679ca51bd3b23769afeda9d"), + new global::Io.Cucumber.Messages.Types.Tag(new global::Io.Cucumber.Messages.Types.Location(13, new System.Nullable(17)), "@screenshot:ollama-local-run", "859f192ce012f65aa1bea381a3079f5d")}), "Scenario", "Run local Ollama workflow end-to-end", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(15, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "a22ef8b3f91a045ca6b0551716491e30"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(16, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I am on the settings page", null, null, "83811f979f941b55b8a6bc9d49fba52c"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(17, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I set the Ollama URL to \"http://localhost:11434\"", null, null, "ae6aae71e6149f5f9a69493f69cb121c"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(18, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I select \"ollama\" as the default provider", null, null, "7dd6bd8501da3251bb125abd4463fe28"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(19, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the model dropdown should be populated", null, null, "3e6babb62913a35b8cef586002811493"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(20, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I select a model", null, null, "c79fd8534135ad5fa9e6df75f58bedaa"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(21, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I click Save Settings", null, null, "f13365b3089baa578a829e4b6ff350ee"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(22, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a success toast", null, null, "c49932fb66511a5194223259c8d89514"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(23, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I reload the settings page", null, null, "a18af31468f7eb5ead6963faa7cdb892"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(24, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "\"ollama\" should be selected as the default provider", null, null, "74fee0eeb6ddb951a4ae93b50646a7b0"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(25, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I navigate to the designer", null, null, "90c93e7ec1ab9b599c08e26ec530dd12"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(26, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Local Ollama Smoke Test\" sample workflow", null, null, "a960c5145196c05db78600ddca59cf32"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(27, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I save and run the workflow", null, null, "abf62f1b9e73415ab8ad977da440bd6c"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(28, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the execution panel should show \"Running\"", null, null, "498234c029cde3509dfaff100bb88123"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(29, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see step progress updates", null, null, "c7504289fe7ce85bafbd97e649cd6a94"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(30, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run should complete with status \"Completed\"", null, null, "27929f78ebf87d50b73296bb308a16ea"), new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(31, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the latest run for the current workflow should include an AI response from step \"" + - "GenerateLocalReply\"", null, null, "3eeb52fe61daf95391d4cdf759af0ed3")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "55d313626ca25559a5041917c6e6f97a")), + "GenerateLocalReply\"", null, null, "c3af9ea10b012d548e92e2906aa77e12")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "f594022c8886a957af95a4f8b4e90254")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(33, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Run HTTP workflow makes real requests", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(34, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "7e9147f534d3e95e853996bce4edf851"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"HTTP API Orchestration\" sample workflow", null, null, "a36f14f3a2cca45b9896c0587811fa0a"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "9c769c4da8d52959a51c38d7057fc554"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(37, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see step \"FetchUserData\" complete", null, null, "47d0a79394fcaf50bdbaba64f5356916"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(38, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see step \"FetchUserPosts\" complete", null, null, "82719adddaf1db5ca7d1c1cf87b68df6"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(39, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run should complete with status \"Completed\"", null, null, "fcd21cbf5d2a2e5b959a45a056670c7e")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "9b7e067be818b1508be6a11e1d921c32")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(34, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "c4f7393d14d4845486e85933eb7934ab"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(35, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"HTTP API Orchestration\" sample workflow", null, null, "a5cd895b7e028659a33bf25e01715ff5"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(36, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "f24f3728cc540150a169a66682525b69"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(37, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see step \"FetchUserData\" complete", null, null, "c61dbebf0696b05eb0d53afda50e70c5"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(38, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I should see step \"FetchUserPosts\" complete", null, null, "7e669c0d8fa4a9599f76dc3fbbac5f36"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(39, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run should complete with status \"Completed\"", null, null, "303bd180b8956950ade853d0c08959ed")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "2085c348c9692e59861445659171908c")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(41, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Cancel a running workflow", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(42, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "0bd26b8445da83568ef20c6af7664f00"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(43, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with a Delay step of 30000ms", null, null, "1373edd1fa865e5fadb83b21d1030f77"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(44, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "9816655774ba6e51abf14c4b9f304276"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(45, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the workflow is running", null, null, "d8bb7155f493d55faee24d62d3c7aea4"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(46, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I cancel the run", null, null, "3dccaf7c930cb1539b83291d67b7bbe7"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(47, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run should show status \"Cancelled\"", null, null, "ebcb7ecc9f468f579c458991d3d6e97c")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "979473d452a7df5ea922fc0a7368e492")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(42, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "f2bd2e5a7c3715539986477dbc2bc679"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(43, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with a Delay step of 30000ms", null, null, "a6fb14c215e5bc549600fd7031ca8726"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(44, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "3848f5448835685da04928bef9fc3ede"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(45, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the workflow is running", null, null, "8db8c55eb1485a5abc23346ed1476fe3"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(46, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I cancel the run", null, null, "4854d5683d3e855599d464ab4e9edb83"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(47, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run should show status \"Cancelled\"", null, null, "ef1b25f3d2f0945eb3441bf4e8052d90")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "a0f57055a6b694599ec4ec5559157993")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(49, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "Failed step shows error in output", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(50, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "f601fafb6f6c9350beebda81dff287ef"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(51, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an HttpStep pointing to an invalid URL", null, null, "0f1e7b73a020b65d833776986da72463"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(52, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "f38df17dad2cae54bee75ca46ccf6b0f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(53, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a step failure in the output panel", null, null, "c6f050742b5a2d5ebe9ccd7f83fa27e1"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(54, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run should complete with status \"Failed\"", null, null, "ea17a7db837a185ea3db0aa75f51ba40")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "7cd93fce37c324509e7fdf06f6d10728")), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(50, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "4e1650aa1a59465e9c7db7853332594f"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(51, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I have a workflow with an HttpStep pointing to an invalid URL", null, null, "5c0fb54238b4e45f9f745e3831b937a4"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(52, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "ff911e6dc8aa3250861c88ef2272ea80"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(53, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "I should see a step failure in the output panel", null, null, "d8b4799cbcfcea56a4a43b177ce278fd"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(54, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run should complete with status \"Failed\"", null, null, "428e6338d5ebfa52b4b4376f437f7710")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "ac6ec1317decf45a939f47736a0ddef7")), new global::Io.Cucumber.Messages.Types.FeatureChild(null, null, new global::Io.Cucumber.Messages.Types.Scenario(new global::Io.Cucumber.Messages.Types.Location(56, new System.Nullable(3)), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Tag[0]), "Scenario", "View run in history after completion", "", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Step[] { - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(57, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "85f111547331885e8445cfd7b03f29d5"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(58, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Hello World\" sample workflow", null, null, "62f25144aded785888666aec847d79f7"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(59, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "5e9ed82f57620a5eb55f2cf2d60dca7f"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(60, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run completes", null, null, "c829679b1c88c75788dcb5683b93d351"), - new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(61, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run should appear in the runs list via API", null, null, "42bb69de25bc5b5bbfae74477f30d9b9")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "c02c50b6f5c2535da77bc5e23c7f9691"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(57, new System.Nullable(5)), "Given ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONTEXT, "the dashboard is running", null, null, "f7b95681ee079e5bb8e5d1ed01100d23"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(58, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "I open the \"Hello World\" sample workflow", null, null, "bbcdc110d23ef35887511a21c5eec233"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(59, new System.Nullable(5)), "When ", global::Io.Cucumber.Messages.Types.StepKeywordType.ACTION, "I save and run the workflow", null, null, "925d88fa50f528549a3100a048fc5250"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(60, new System.Nullable(5)), "And ", global::Io.Cucumber.Messages.Types.StepKeywordType.CONJUNCTION, "the run completes", null, null, "f5be5b32da41545a9b7906f063dae87e"), + new global::Io.Cucumber.Messages.Types.Step(new global::Io.Cucumber.Messages.Types.Location(61, new System.Nullable(5)), "Then ", global::Io.Cucumber.Messages.Types.StepKeywordType.OUTCOME, "the run should appear in the runs list via API", null, null, "a850b3afffc2fa5aaf93bde871f21262")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Examples[0]), "1aecd7288d508f5a96e92e49bab397c9"))})), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Comment[0])); } private static global::System.Collections.Generic.IEnumerable PicklesFunc() { return new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.Pickle[] { - new global::Io.Cucumber.Messages.Types.Pickle("cbfeea8d5a546b5b9e9d6f198343a63d", "Features/WorkflowExecution.feature", "Run Hello World workflow end-to-end", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + new global::Io.Cucumber.Messages.Types.Pickle("92991bcc77004d58864721840efbc2b1", "Features/WorkflowExecution.feature", "Run Hello World workflow end-to-end", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "d82ca96ed6e5b958a32faa9ba0196f87"}), "a6a18db8832019518a0a9264e6c54868", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "c717ab0adbd42551acdc167c02074261"}), "38b4acdf05d8d35dac8726062fca2cd9", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "77184009713e2258847da4a57a08871c"}), "c82538206d41bc5f891392a88c71764e", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Hello World\" sample workflow"), + "74c3e5965d79aa5ea1c2c8b59cc16098"}), "5d28e64309032e50a34c87cb3236362c", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Hello World\" sample workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "d24b77addd5e1052a390ce6764aa1520"}), "c417df509473d25ab9dbda7796354cec", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), + "f5040d5a4620f05785f23103bb6916e0"}), "57bee731c24f395cadc80226c7bdf211", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3c5986a16e55085aa02269976160736b"}), "eb264d563b35df5e859df97972fd94dc", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the execution panel should show \"Running\""), + "e23500056b242654923d37af377288df"}), "dfaee495ebc32759a8a901b3ee45d910", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the execution panel should show \"Running\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f002c63f4e5a8c5da1948cc96a37cfef"}), "fe0152effee2175f82d72960be393f21", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see step progress updates"), + "ee51452a2c58f75c8b422098e096b398"}), "d7b4646db34706559ff59f6401d16535", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see step progress updates"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "2fc09aada0cd4c5c8be06d1e29c283b1"}), "a06de6dedba1f057bb0333a656f78221", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should complete with status \"Completed\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "6814785dc9a39e55949a5fc8a9a2c7e9")}), new System.Collections.Generic.List(new string[] { - "871bc1e828d23b5ba7effa1ad259e4b2"})), - new global::Io.Cucumber.Messages.Types.Pickle("9bf2c0534041c6579e3afee53f9c55b2", "Features/WorkflowExecution.feature", "Run local Ollama workflow end-to-end", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "6fdf0f9e456fcb5d8a634da0e116309c"}), "487657b335f9f75598db8355f872b46a", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should complete with status \"Completed\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "61e849543b48455e911e66807f650fca")}), new System.Collections.Generic.List(new string[] { + "2d8561d05a4aa65983fa9e4d774a503f"})), + new global::Io.Cucumber.Messages.Types.Pickle("ce60e2840d9a4d59a8d4848be7151179", "Features/WorkflowExecution.feature", "Run local Ollama workflow end-to-end", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "840c6bc37277375ba065e2d69f9e15c2"}), "8eadaa484447e45d8db6d0e237c05d15", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "a22ef8b3f91a045ca6b0551716491e30"}), "5e7a91a59cbbfb5fa3f4d56c548ff6b1", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "aed5c4eccf2f5957bd17e1746be2e2d8"}), "de19ccc0fa5b3759aab8ffae8f4a7dbc", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), + "83811f979f941b55b8a6bc9d49fba52c"}), "c63ea467b24cc559a8aabea5d7923f04", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I am on the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "900e9ef36ee56555af265b9259ac5f60"}), "5632335895dbc658b24224059adfd191", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I set the Ollama URL to \"http://localhost:11434\""), + "ae6aae71e6149f5f9a69493f69cb121c"}), "c99dab944ffd9a5e8cbaa2fd54a9b92c", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I set the Ollama URL to \"http://localhost:11434\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "6787a3bcb78f825dbcf0692a98164b6d"}), "22b2e4028d62e751a2d99ff3a9ccbaae", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"ollama\" as the default provider"), + "7dd6bd8501da3251bb125abd4463fe28"}), "f4ddece13691fc5bb301db66acb7afb0", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select \"ollama\" as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "21ea71e93e6236568db0fd42aa04e52d"}), "26a1399953372e5f9fc8ca5cea273e4e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), + "3e6babb62913a35b8cef586002811493"}), "871a6efc9a1bb85fa190306635005d1d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the model dropdown should be populated"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "8f0f175e25646757b75bbbb84d1af392"}), "0d13a86cd46d3d57936810f3617759f2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), + "c79fd8534135ad5fa9e6df75f58bedaa"}), "605cf37d808a6358b297449bf5211ba0", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I select a model"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "1b87b298a6922e539e8a637d8d725771"}), "48a227161d10cb57bb125c42277f4994", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), + "f13365b3089baa578a829e4b6ff350ee"}), "c762d129421d8e5b9a4ccbc2acee636b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I click Save Settings"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "10f224a7ae83bf5b952a285df9b38ca3"}), "24d37cf878b703578dc0d2df055986fb", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast"), + "c49932fb66511a5194223259c8d89514"}), "e2bacc8f04cb835ba536b9c363a49b1a", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a success toast"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "b87983604002515d82c1f8d828ae4149"}), "322b967bfc115a5d959738d92a36f31b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), + "a18af31468f7eb5ead6963faa7cdb892"}), "e5c757f773eb5a5d9e2dab8d229f80ed", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I reload the settings page"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "fdb0d18fe9342e5683f246474f2e4d07"}), "e749c7c56ce1c45f93e0544b044e84a3", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "\"ollama\" should be selected as the default provider"), + "74fee0eeb6ddb951a4ae93b50646a7b0"}), "ee0a7912ee7a605b8efb78ff8a138e68", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "\"ollama\" should be selected as the default provider"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "c6d7ffb6eece795daa79cfc1009defe8"}), "d658fa648ed4c652bd854e91681a4a79", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I navigate to the designer"), + "90c93e7ec1ab9b599c08e26ec530dd12"}), "b4c66da2f5fdb459a09c6d633e014215", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I navigate to the designer"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "468564f729e9a959984faefcffd9a7d3"}), "314eb6b5f48b155c9d077317eed0488f", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the \"Local Ollama Smoke Test\" sample workflow"), + "a960c5145196c05db78600ddca59cf32"}), "d87df9a72ee0eb5db41f2d867922b49e", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I open the \"Local Ollama Smoke Test\" sample workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a7821787ed44f053862ce22b4025d094"}), "2353050e80a845539ef67b7a697cbe1f", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), + "abf62f1b9e73415ab8ad977da440bd6c"}), "ce0acc8c4a925853a9f5192b2069f2b3", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "808cc452062c645483fbea9b752a257c"}), "248f7115f3e1bc558408dafa25a10392", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the execution panel should show \"Running\""), + "498234c029cde3509dfaff100bb88123"}), "159c03926a85775fb7d1c0ca0a5f3e83", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the execution panel should show \"Running\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "cefd731ea90da95bbdb0465784c58167"}), "8ff0138da2d18a529b5958d7881e6901", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see step progress updates"), + "c7504289fe7ce85bafbd97e649cd6a94"}), "f0cc9e3a82b66d5781577a0a17d5fd41", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see step progress updates"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "bcce9334798d9054a27829ddf7a032a5"}), "8d66ec039a121251b02adeb30ae7552e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should complete with status \"Completed\""), + "27929f78ebf87d50b73296bb308a16ea"}), "db332f579a6344568ffa885e3063419d", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should complete with status \"Completed\""), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3eeb52fe61daf95391d4cdf759af0ed3"}), "7d9617c2acda6d51a45852be423d0945", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the latest run for the current workflow should include an AI response from step \"" + + "c3af9ea10b012d548e92e2906aa77e12"}), "3e5bbfe6d3bfee5486267e0572341b2b", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the latest run for the current workflow should include an AI response from step \"" + "GenerateLocalReply\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "6814785dc9a39e55949a5fc8a9a2c7e9"), - new global::Io.Cucumber.Messages.Types.PickleTag("@local-ollama", "3eb075ac61dc0b5bb623ad970f5a3da4"), - new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:ollama-local-run", "daee9dba130d01539479f363ec1614f3")}), new System.Collections.Generic.List(new string[] { - "55d313626ca25559a5041917c6e6f97a"})), - new global::Io.Cucumber.Messages.Types.Pickle("88cca729c889a15595231d49b382bcea", "Features/WorkflowExecution.feature", "Run HTTP workflow makes real requests", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "61e849543b48455e911e66807f650fca"), + new global::Io.Cucumber.Messages.Types.PickleTag("@local-ollama", "5b14c39fd679ca51bd3b23769afeda9d"), + new global::Io.Cucumber.Messages.Types.PickleTag("@screenshot:ollama-local-run", "859f192ce012f65aa1bea381a3079f5d")}), new System.Collections.Generic.List(new string[] { + "f594022c8886a957af95a4f8b4e90254"})), + new global::Io.Cucumber.Messages.Types.Pickle("8e87f07e66eeb558901ae1b015e465e7", "Features/WorkflowExecution.feature", "Run HTTP workflow makes real requests", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "7e9147f534d3e95e853996bce4edf851"}), "d45151278879a756a482c09c12a83164", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "c4f7393d14d4845486e85933eb7934ab"}), "44fb802bb8e6da5cb9480b6f0c9df7d7", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "a36f14f3a2cca45b9896c0587811fa0a"}), "9e8432b28114ca5f957303483c624d09", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"HTTP API Orchestration\" sample workflow"), + "a5cd895b7e028659a33bf25e01715ff5"}), "6b0a8167b7c41a528aae82a0397d0985", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"HTTP API Orchestration\" sample workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "9c769c4da8d52959a51c38d7057fc554"}), "e4ef73ee2d168b5aadb57d7d89eb78c1", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), + "f24f3728cc540150a169a66682525b69"}), "203cdbd391516e559777b3359ac95e0d", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "47d0a79394fcaf50bdbaba64f5356916"}), "3c59d82a4c978a5baaaa0028040f3d09", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see step \"FetchUserData\" complete"), + "c61dbebf0696b05eb0d53afda50e70c5"}), "34784ffe53f88556b5cd1ff1d326b882", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see step \"FetchUserData\" complete"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "82719adddaf1db5ca7d1c1cf87b68df6"}), "bed9941e1e4cf158be4dfd1370063984", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see step \"FetchUserPosts\" complete"), + "7e669c0d8fa4a9599f76dc3fbbac5f36"}), "12869517aa03cf54bd79545a178dc99e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see step \"FetchUserPosts\" complete"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "fcd21cbf5d2a2e5b959a45a056670c7e"}), "d42c4bdec6c82a53a1a803ab4460f52e", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should complete with status \"Completed\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "6814785dc9a39e55949a5fc8a9a2c7e9")}), new System.Collections.Generic.List(new string[] { - "9b7e067be818b1508be6a11e1d921c32"})), - new global::Io.Cucumber.Messages.Types.Pickle("fe76afa3dac4d553b3f1d7f4f966f9ad", "Features/WorkflowExecution.feature", "Cancel a running workflow", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "303bd180b8956950ade853d0c08959ed"}), "7b8e54e10bad735a900cbac6f46f055a", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should complete with status \"Completed\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "61e849543b48455e911e66807f650fca")}), new System.Collections.Generic.List(new string[] { + "2085c348c9692e59861445659171908c"})), + new global::Io.Cucumber.Messages.Types.Pickle("97a27a50234f9855aeb802b124f10c3e", "Features/WorkflowExecution.feature", "Cancel a running workflow", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "0bd26b8445da83568ef20c6af7664f00"}), "21c7c8cc54480c579bfe2c799463d438", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "f2bd2e5a7c3715539986477dbc2bc679"}), "0e8746cac9642c5293120896633da7ea", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "1373edd1fa865e5fadb83b21d1030f77"}), "ea7f58911873ba51949b44a8f66f2dda", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with a Delay step of 30000ms"), + "a6fb14c215e5bc549600fd7031ca8726"}), "ec2f94583a7c3955bf14df29e16365f8", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with a Delay step of 30000ms"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "9816655774ba6e51abf14c4b9f304276"}), "794a481cd1f0de5f87e46640a823c7ee", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), + "3848f5448835685da04928bef9fc3ede"}), "a2109c2bdb59f1529532b5a60d33e5f2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "d8bb7155f493d55faee24d62d3c7aea4"}), "65802f6ba93ac95abc6a2418b429cf30", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "the workflow is running"), + "8db8c55eb1485a5abc23346ed1476fe3"}), "274fd4f2b459c05cb03198cf6f23503b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "the workflow is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "3dccaf7c930cb1539b83291d67b7bbe7"}), "0a8618296952335e88f535b82b7a9f2d", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I cancel the run"), + "4854d5683d3e855599d464ab4e9edb83"}), "301097d3919b4f5c9378efc0fff0ac2b", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I cancel the run"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ebcb7ecc9f468f579c458991d3d6e97c"}), "378eeb8f73ec205ea2ceef55c14a84b9", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should show status \"Cancelled\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "6814785dc9a39e55949a5fc8a9a2c7e9")}), new System.Collections.Generic.List(new string[] { - "979473d452a7df5ea922fc0a7368e492"})), - new global::Io.Cucumber.Messages.Types.Pickle("cb20e8bffac1dd589c4e61caad8f501c", "Features/WorkflowExecution.feature", "Failed step shows error in output", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "ef1b25f3d2f0945eb3441bf4e8052d90"}), "b4a85142b2374d5abdbefd41924f0833", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should show status \"Cancelled\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "61e849543b48455e911e66807f650fca")}), new System.Collections.Generic.List(new string[] { + "a0f57055a6b694599ec4ec5559157993"})), + new global::Io.Cucumber.Messages.Types.Pickle("bb47a2c3198e6d59a28a6e4342eaec1a", "Features/WorkflowExecution.feature", "Failed step shows error in output", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f601fafb6f6c9350beebda81dff287ef"}), "372022d12b6bdc5781042d70e3e7e0b0", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "4e1650aa1a59465e9c7db7853332594f"}), "16664df917f6235b94182f5b2bef70ab", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "0f1e7b73a020b65d833776986da72463"}), "813af8d72504415daa7e63b8f028efc8", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an HttpStep pointing to an invalid URL"), + "5c0fb54238b4e45f9f745e3831b937a4"}), "26a71350d2e6cc5394128c58bfda5971", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I have a workflow with an HttpStep pointing to an invalid URL"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "f38df17dad2cae54bee75ca46ccf6b0f"}), "8050d72621b9da5991ef1429c5b3bde2", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), + "ff911e6dc8aa3250861c88ef2272ea80"}), "06dc20254be1a75485c18b2676879b07", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "c6f050742b5a2d5ebe9ccd7f83fa27e1"}), "a62eb9f3d232dc5eb5ba8e9cb35ad058", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a step failure in the output panel"), + "d8b4799cbcfcea56a4a43b177ce278fd"}), "4a053a682ac9be5eb04bee5504b934c8", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "I should see a step failure in the output panel"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "ea17a7db837a185ea3db0aa75f51ba40"}), "71d08078daec475995c6035cb9fff6ee", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should complete with status \"Failed\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "6814785dc9a39e55949a5fc8a9a2c7e9")}), new System.Collections.Generic.List(new string[] { - "7cd93fce37c324509e7fdf06f6d10728"})), - new global::Io.Cucumber.Messages.Types.Pickle("07fdea21122191568b39c9d38f5839be", "Features/WorkflowExecution.feature", "View run in history after completion", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { + "428e6338d5ebfa52b4b4376f437f7710"}), "5e119657e58d8e58a0fd6a15c51cf3f2", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should complete with status \"Failed\"")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "61e849543b48455e911e66807f650fca")}), new System.Collections.Generic.List(new string[] { + "ac6ec1317decf45a939f47736a0ddef7"})), + new global::Io.Cucumber.Messages.Types.Pickle("76a9d0d8c8af5b52a6cc6e40f6703acc", "Features/WorkflowExecution.feature", "View run in history after completion", "en", new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleStep[] { new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "85f111547331885e8445cfd7b03f29d5"}), "c5673b6432cff958a33643b0056a5d47", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), + "f7b95681ee079e5bb8e5d1ed01100d23"}), "bb691fdcbea51751b84edabe0ecdfb34", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "the dashboard is running"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "62f25144aded785888666aec847d79f7"}), "e0b8888bc915445cacb2fc7739a10fd5", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Hello World\" sample workflow"), + "bbcdc110d23ef35887511a21c5eec233"}), "00c6afc26eab465ab690b9294fd8f5be", global::Io.Cucumber.Messages.Types.PickleStepType.CONTEXT, "I open the \"Hello World\" sample workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "5e9ed82f57620a5eb55f2cf2d60dca7f"}), "af714f91f806705088b5b5018064fd5e", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), + "925d88fa50f528549a3100a048fc5250"}), "636607e66c62fc5399180637033fb4c6", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "I save and run the workflow"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "c829679b1c88c75788dcb5683b93d351"}), "d7daa5a83db39c5dba70a4ad69d1c1be", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "the run completes"), + "f5be5b32da41545a9b7906f063dae87e"}), "816e2e9b92b1cd529f30b2201f2b136c", global::Io.Cucumber.Messages.Types.PickleStepType.ACTION, "the run completes"), new global::Io.Cucumber.Messages.Types.PickleStep(null, new System.Collections.Generic.List(new string[] { - "42bb69de25bc5b5bbfae74477f30d9b9"}), "bd1df3c3cc811e50822cb86cbbfb23d4", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should appear in the runs list via API")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { - new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "6814785dc9a39e55949a5fc8a9a2c7e9")}), new System.Collections.Generic.List(new string[] { - "c02c50b6f5c2535da77bc5e23c7f9691"}))}); + "a850b3afffc2fa5aaf93bde871f21262"}), "b8acc7e9ee549959b26a3f9d2f48ae91", global::Io.Cucumber.Messages.Types.PickleStepType.OUTCOME, "the run should appear in the runs list via API")}), new System.Collections.Generic.List(new global::Io.Cucumber.Messages.Types.PickleTag[] { + new global::Io.Cucumber.Messages.Types.PickleTag("@UI", "61e849543b48455e911e66807f650fca")}), new System.Collections.Generic.List(new string[] { + "1aecd7288d508f5a96e92e49bab397c9"}))}); } private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() diff --git a/tests/WorkflowFramework.Dashboard.UITests/WorkflowFramework.Dashboard.UITests.csproj b/tests/WorkflowFramework.Dashboard.UITests/WorkflowFramework.Dashboard.UITests.csproj index 9f703ad..a84a729 100644 --- a/tests/WorkflowFramework.Dashboard.UITests/WorkflowFramework.Dashboard.UITests.csproj +++ b/tests/WorkflowFramework.Dashboard.UITests/WorkflowFramework.Dashboard.UITests.csproj @@ -5,6 +5,9 @@ false false WorkflowFramework.Dashboard.UITests + + false diff --git a/tests/WorkflowFramework.Dashboard.UITests/packages.lock.json b/tests/WorkflowFramework.Dashboard.UITests/packages.lock.json deleted file mode 100644 index 7a7b409..0000000 --- a/tests/WorkflowFramework.Dashboard.UITests/packages.lock.json +++ /dev/null @@ -1,1020 +0,0 @@ -{ - "version": 2, - "dependencies": { - "net10.0": { - "Aspire.Hosting.Testing": { - "type": "Direct", - "requested": "[9.2.1, )", - "resolved": "9.2.1", - "contentHash": "5+TAOVoWnPsHr5OHjUDgg7yrROsRz6qd0/YKCDXaAJe6pBqEbup8YVxjhWK60o5OOKgbL0MDqFxtiqrY0E2VhA==", - "dependencies": { - "AspNetCore.HealthChecks.Uris": "9.0.0", - "Aspire.Hosting": "9.2.1", - "Aspire.Hosting.AppHost": "9.2.1", - "Google.Protobuf": "3.30.1", - "Grpc.AspNetCore": "2.70.0", - "Grpc.Net.ClientFactory": "2.70.0", - "Grpc.Tools": "2.71.0", - "Humanizer.Core": "2.14.1", - "JsonPatch.Net": "3.3.0", - "KubernetesClient": "16.0.2", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Diagnostics.HealthChecks": "9.0.4", - "Microsoft.Extensions.Hosting": "9.0.4", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.4", - "Microsoft.Extensions.Http": "9.0.4", - "Microsoft.Extensions.Http.Resilience": "9.4.0", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4", - "Newtonsoft.Json": "13.0.3", - "Polly.Core": "8.5.2", - "Polly.Extensions": "8.5.2", - "StreamJsonRpc": "2.21.69", - "System.IO.Hashing": "9.0.3" - } - }, - "FluentAssertions": { - "type": "Direct", - "requested": "[8.3.0, )", - "resolved": "8.3.0", - "contentHash": "iri1druxHPUAvaFqTUKJG7NOHwnOLmWwfDorgezZWpeBWBJmk2o8niI7jL7zW9TEFGnUpMJi/JLG6FXgr3cM3A==" - }, - "Microsoft.Extensions.Http.Resilience": { - "type": "Direct", - "requested": "[9.5.0, )", - "resolved": "9.5.0", - "contentHash": "6+D5dTm6t+Rg93ODzQ/obWuUxl+YPEm6bU4lz6dA2lxPjJmqbsUKP3l2bXlMcahj3EFj9n4gpRD7fzF46q+ecQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.Http.Diagnostics": "9.5.0", - "Microsoft.Extensions.ObjectPool": "9.0.5", - "Microsoft.Extensions.Resilience": "9.5.0" - } - }, - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[18.0.1, )", - "resolved": "18.0.1", - "contentHash": "WNpu6vI2rA0pXY4r7NKxCN16XRWl5uHu6qjuyVLoDo6oYEggIQefrMjkRuibQHm/NslIUNCcKftvoWAN80MSAg==", - "dependencies": { - "Microsoft.CodeCoverage": "18.0.1", - "Microsoft.TestPlatform.TestHost": "18.0.1" - } - }, - "Microsoft.Playwright": { - "type": "Direct", - "requested": "[1.52.0, )", - "resolved": "1.52.0", - "contentHash": "zH8a7OiXtq8BC6i0yYHAG/DSN8J8/bVyQYVESK7mK1ZJF19eY1ca51BAQpQxzF+Qm/A20x6Rsl8cT+QYXSfxbw==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0", - "System.ComponentModel.Annotations": "5.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "Reqnroll": { - "type": "Direct", - "requested": "[3.0.0, )", - "resolved": "3.0.0", - "contentHash": "b2f0QERw3sdHjh3gRVxHp32sa3Sm816Wv6G+o7W8q2PnjMkylEaqUYF/kQnaQJ98omqqfCmD/JSFDrrFM/IYpg==", - "dependencies": { - "Cucumber.CucumberExpressions": "17.1.0", - "Cucumber.HtmlFormatter": "21.14.0", - "Cucumber.Messages": "28.0.0", - "Gherkin": "34.0.0", - "Microsoft.Bcl.AsyncInterfaces": "9.0.6", - "Microsoft.Extensions.DependencyModel": "8.0.2" - } - }, - "Reqnroll.xUnit": { - "type": "Direct", - "requested": "[3.0.0, )", - "resolved": "3.0.0", - "contentHash": "J96jzIaruyq9O368FE4UZyegwZh8tM5kIFaEzdHPMc4YJxNuv8jmE9+xNXTvK4PbpRBwwi30LxTggP0XlLe5ag==", - "dependencies": { - "Reqnroll": "[3.0.0]", - "Reqnroll.Tools.MsBuild.Generation": "[3.0.0]", - "Xunit.SkippableFact": "1.4.13", - "xunit.core": "2.8.1" - } - }, - "xunit": { - "type": "Direct", - "requested": "[2.9.3, )", - "resolved": "2.9.3", - "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", - "dependencies": { - "xunit.analyzers": "1.18.0", - "xunit.assert": "2.9.3", - "xunit.core": "[2.9.3]" - } - }, - "xunit.runner.visualstudio": { - "type": "Direct", - "requested": "[3.1.0, )", - "resolved": "3.1.0", - "contentHash": "K9O9TOzugqOo4LJ87uuq1VG8RAqGp20Ng85Wx932oT5LNBkIgeeGYubVW5UMnOOTanFNbGavmbuYrJr4INzSwg==" - }, - "Aspire.Dashboard.Sdk.win-x64": { - "type": "Transitive", - "resolved": "9.2.1", - "contentHash": "Ps8SfLO0BfNfKhthJ8o+3Rd6ritF2eCafCcWW9vfdT9wcMvn9pujPWPMJo6XVjk1C3zHrPyva9UMTbOT48HKTg==" - }, - "Aspire.Hosting": { - "type": "Transitive", - "resolved": "9.2.1", - "contentHash": "Awidk6C7nris+LT3Yq48oihv5uVbGmP/4rpO1sLxvxwuxSXEnPkrB2MTGCCqr3Z/e68u9J54s6p8RBdIYwTe0w==", - "dependencies": { - "AspNetCore.HealthChecks.Uris": "9.0.0", - "Google.Protobuf": "3.30.1", - "Grpc.AspNetCore": "2.70.0", - "Grpc.Net.ClientFactory": "2.70.0", - "Grpc.Tools": "2.71.0", - "Humanizer.Core": "2.14.1", - "JsonPatch.Net": "3.3.0", - "KubernetesClient": "16.0.2", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.2", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", - "Microsoft.Extensions.Hosting": "8.0.1", - "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", - "Microsoft.Extensions.Http": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2", - "Microsoft.Extensions.Primitives": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "Polly.Core": "8.5.2", - "StreamJsonRpc": "2.21.69", - "System.IO.Hashing": "9.0.3" - } - }, - "Aspire.Hosting.Orchestration.win-x64": { - "type": "Transitive", - "resolved": "9.2.1", - "contentHash": "zql5k3nKMwCBfpODLt/sy/nKsZM272+LV67e3ehv9Ec2+0mUuPRs2DGx9mzvh7sBYBq53pF7A7pn9E3V6FkOXw==" - }, - "AspNetCore.HealthChecks.Uris": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "XYdNlA437KeF8p9qOpZFyNqAN+c0FXt/JjTvzH/Qans0q0O3pPE8KPnn39ucQQjR/Roum1vLTP3kXiUs8VHyuA==", - "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", - "Microsoft.Extensions.Http": "8.0.0" - } - }, - "Cucumber.CucumberExpressions": { - "type": "Transitive", - "resolved": "17.1.0", - "contentHash": "IZFDLLwrUCKuGDXQzmAWZa+kQFpVmVwWD8wEl0UWGOR83UQfzqg8hZeSSNUOXlW0Kh3vMO6kEm3FpNC4amKMaw==" - }, - "Cucumber.HtmlFormatter": { - "type": "Transitive", - "resolved": "21.14.0", - "contentHash": "pkGsMqbLoLXk6nTYQqFqtWRov8bkVpQKwZRj31Q1xd9m+1ClyHA2rZtVMh4ecakujU62ksTh48qCbw9xi1E+Wg==", - "dependencies": { - "Cucumber.Messages": "[27.0.0, 29.0.0)" - } - }, - "Cucumber.Messages": { - "type": "Transitive", - "resolved": "28.0.0", - "contentHash": "Kthb+tAd8sKlbBrtxMRI6j8lU8cn/MzbDAPfXuHFTfK2dc6z7777SZV7rnEUrXHisw3l3U5gXRB3BG24B6lwKw==" - }, - "Fractions": { - "type": "Transitive", - "resolved": "7.3.0", - "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" - }, - "Gherkin": { - "type": "Transitive", - "resolved": "34.0.0", - "contentHash": "C7S8aXKI65TfDpwVBkQlRbrqjj4Bv/Qf5CdZPrSJnfdUU9CZZtpLrovuR31iVMR8Oe2XEkdhacHnDUMBNipu/w==", - "dependencies": { - "Cucumber.Messages": "[28.0.0, 29.0.0)" - } - }, - "Google.Protobuf": { - "type": "Transitive", - "resolved": "3.30.1", - "contentHash": "HeWXDQBabQn/sCGicbeLJ0HMunknfC4FdLrOQOsaMJHcpqx3HVIpyyJqTrqJlWnza870twhOb+rBcaTiC/TlNA==" - }, - "Grpc.AspNetCore": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "s29ST5F2/PZLzOnfqfeDn0emAZajBtYnV9G7hkbK8Eu9+XphoL3KfiEsg2eBsx7P9YYQXcksDbE+CbHApMZeJA==", - "dependencies": { - "Google.Protobuf": "3.27.0", - "Grpc.AspNetCore.Server.ClientFactory": "2.70.0", - "Grpc.Tools": "2.70.0" - } - }, - "Grpc.AspNetCore.Server": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "9d6JuMLSxwOX4zERV7HBwq1XL8DD48a6FSoxD5dDXrCz/o0HqMXE2+lRcXHckOlz1JCesznW8XMMJdsU1FfY7w==", - "dependencies": { - "Grpc.Net.Common": "2.70.0" - } - }, - "Grpc.AspNetCore.Server.ClientFactory": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "k4GrvUAgVWm7DyhnV55MHdX4bQSpZVEQmlZO3bdSmGZ+z6Hx+CwDlhqiReczCm6qbzSUbS1YW0t7z7UEObTwKA==", - "dependencies": { - "Grpc.AspNetCore.Server": "2.70.0", - "Grpc.Net.ClientFactory": "2.70.0" - } - }, - "Grpc.Core.Api": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "66UotvWcSIq41oiQhLWcQACyKPM4umxXNiht5DQTLZJfNwEswWOcS7Z0xIEHyNIBE7ZpjotH22bEjTkvhPxmVw==" - }, - "Grpc.Net.Client": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "xNv0FFCVJa5S1beUtye82WFCxKThuE1jbN8DO1x1Rj8VSIWXLBUmfSID5a1fGzsU2R/EMfwPoWclJ2RMfQuGXw==", - "dependencies": { - "Grpc.Net.Common": "2.70.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Grpc.Net.ClientFactory": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "Qg+93oj/8RdEw3PnLZNNYWnWCWyJYC/ZYZcjeln/pLaxLaPvdXES1peiqSJUI4wLFZ1JwGlbWt8+nM1i2E7ihg==", - "dependencies": { - "Grpc.Net.Client": "2.70.0", - "Microsoft.Extensions.Http": "6.0.0" - } - }, - "Grpc.Net.Common": { - "type": "Transitive", - "resolved": "2.70.0", - "contentHash": "rBdEUMyCwa+iB8mqC6JKyPbj3SBHHkReJj/yy/XKJI63GcG6w9DJMMGTVcYHqq4Ci2W4m0HT4jt2pFfFscar8g==", - "dependencies": { - "Grpc.Core.Api": "2.70.0" - } - }, - "Grpc.Tools": { - "type": "Transitive", - "resolved": "2.71.0", - "contentHash": "r8zHZm7kHdMrtujnkcuQ0BNDH2969at/8Va1ZzQgVblaQzR7tm8JlA3G+5Z5IFbvvf9PcAr1/VcoSR+g7j4Nyw==" - }, - "Humanizer.Core": { - "type": "Transitive", - "resolved": "2.14.1", - "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" - }, - "IdentityModel": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "to99aLL5Gev1GOb2gUao/UZXT/uXMyjEmHPNrf/vJI2HBD1LMCTeC4SBCe/cqMIB12V9v+eSieq7ff0lju9pOQ==" - }, - "IdentityModel.OidcClient": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "m2PZbjeG3nXIQ72NLZvFz3FLFk7GmqLnxO/ifUvaTEE3BDZXp7DXAdjDP6TQKaL20+wDnej2ffA1Yh3vVcJOkA==", - "dependencies": { - "IdentityModel": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0" - } - }, - "Json.More.Net": { - "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "qtwsyAsL55y2vB2/sK4Pjg3ZyVzD5KKSpV3lOAMHlnjFfsjQ/86eHJfQT9aV1YysVXzF4+xyHOZbh7Iu3YQ7Lg==" - }, - "JsonPatch.Net": { - "type": "Transitive", - "resolved": "3.3.0", - "contentHash": "GIcMMDtzfzVfIpQgey8w7dhzcw6jG5nD4DDAdQCTmHfblkCvN7mI8K03to8YyUhKMl4PTR6D6nLSvWmyOGFNTg==", - "dependencies": { - "JsonPointer.Net": "5.2.0" - } - }, - "JsonPointer.Net": { - "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "qe1F7Tr/p4mgwLPU9P60MbYkp+xnL2uCPnWXGgzfR/AZCunAZIC0RZ32dLGJJEhSuLEfm0YF/1R3u5C7mEVq+w==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Json.More.Net": "2.1.0" - } - }, - "KubernetesClient": { - "type": "Transitive", - "resolved": "16.0.2", - "contentHash": "MTec7O7S23OtffS7lGnt75Q3h2/Jdl+y54uoJyP6MeGnvzeuAGq5n8QSaqUkLvDILvD92FS5kcEqpiCr79UnWQ==", - "dependencies": { - "Fractions": "7.3.0", - "IdentityModel.OidcClient": "6.0.0", - "System.IdentityModel.Tokens.Jwt": "8.3.0", - "YamlDotNet": "16.3.0" - } - }, - "MessagePack": { - "type": "Transitive", - "resolved": "2.5.192", - "contentHash": "Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==", - "dependencies": { - "MessagePack.Annotations": "2.5.192", - "Microsoft.NET.StringTools": "17.6.3" - } - }, - "MessagePack.Annotations": { - "type": "Transitive", - "resolved": "2.5.192", - "contentHash": "jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "9.0.6", - "contentHash": "82rLw487j5jBXEi2r3WvA/cagOhcRREVRtet6izzjDMY+i392W5oNSN2KCtuIvlTpyMONEUD0MIlGAgDdsvQ/w==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "18.0.1", - "contentHash": "O+utSr97NAJowIQT/OVp3Lh9QgW/wALVTP4RG1m2AfFP4IyJmJz0ZBmFJUsRQiAPgq6IRC0t8AAzsiPIsaUDEA==" - }, - "Microsoft.Extensions.AmbientMetadata.Application": { - "type": "Transitive", - "resolved": "9.5.0", - "contentHash": "GHgq9tfncuDSaPtwd1od9It3omPuq5PmHDkTWC91VRy75SWvvT7AX+zyDEurp1+oYgLEObQ6PICv+hZvht8dig==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" - } - }, - "Microsoft.Extensions.Compliance.Abstractions": { - "type": "Transitive", - "resolved": "9.5.0", - "contentHash": "jK7bWPhu60GvcVSqMXOdV6ZLOP5rnwvmlqSD2E5fTkAXwoGYUV/5U3tQbvlZtOpeXTu509eg2VEb+l66d7dtSg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.ObjectPool": "9.0.5" - } - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "uYXLg2Gt8KUH5nT3u+TBpg9VrRcN5+2zPmIjqEHR4kOoBwsbtMDncEJw9HiLvZqGgIo2TR4oraibAoy5hXn2bQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "ew0G6gIznnyAkbIa67wXspkDFcVektjN3xaDAfBDIPbWph+rbuGaaohFxUSGw28ht7wdcWtTtElKnzfkcDDbOQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.5" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "7pQ4Tkyofm8DFWFhqn9ZmG8qSAC2VitWleATj5qob9V9KtoxCVdwRtmiVl/ha3WAgjkEfW++JLWXox9MJwMgkg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "TbM2HElARG7z1gxwakdppmOkm1SykPqDcu3EF97daEwSb/+TXnRrFfJtF+5FWWxcsNhbRrmLfS2WszYcab7u1A==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "2IGiG3FtVnD83IA6HYGuNei8dOw455C09yEhGl8bjcY6aGZgoC6yhYvDnozw8wlTowfoG9bxVrdTsr2ACZOYHg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "UY864WQ3AS2Fkc8fYLombWnjrXwYt+BEHHps0hY4sxlgqaVW06AxbpgRZjfYf8PyRbplJqruzZDB/nSLT+7RLQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Physical": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "vVXI70CgT/dmXV3MM+n/BR2rLXEoAyoK0hQT+8MrbCMuJBiLRxnTtSrksNiASWCwOtxo/Tyy7CO8AGthbsYxnw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "zuvyC72gJkJyodyGowCuz3EQ1QvzNXJtKusuRzmjoHr17aeB3X0aSiKFB++HMHnQIWWlPOBf9YHTQfEqzbgl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Json": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Physical": "9.0.4" - } - }, - "Microsoft.Extensions.DependencyInjection.AutoActivation": { - "type": "Transitive", - "resolved": "9.5.0", - "contentHash": "JT0VpQl0yrkqdQB8IrN3IqI5frfH8BzuHSsHbNU0Y1qbG/F+gF6A7rBAZTR4NfxQHTwTrO7tnrrVixEmBQ/PyQ==", - "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "9.0.5" - } - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" - }, - "Microsoft.Extensions.Diagnostics": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "fRiUjmhm9e4vMp6WEO9MgWNxVtWSr4Pcgh1W4DyJIr8bRANlZz9JU7uicf7ShzMspDxo/9Ejo9zJ6qQZY0IhVw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" - } - }, - "Microsoft.Extensions.Diagnostics.Abstractions": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6YfTcULCYREMTqtk+s3UiszsFV2xN2FXtxdQpurmQJY9Cp/QGiM4MTKfJKUo7AzdLuzjOKKMWjQITmvtK7AsUg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" - } - }, - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { - "type": "Transitive", - "resolved": "9.5.0", - "contentHash": "QKLs7fG05WqLyp5zOGENZ18XZzVJ2TCw7WTnsQcDwQqA34YOev2vBmIk4FwtPqPieGdqQhzcN032nZkKacIrdQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" - } - }, - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "XM6WwNbDkVuGhDN89eKxA2Og2eMDXB0PVI7PEzl2R0MbFjYUlfTh7D7vBPEWUVCf2zPDAFiwcMlnVzi6Umq5mg==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "LLm+e8lvD+jOI+blHRSxPqywPaohOTNcVzQv548R1UpkEiNB2D+zf3RrqxBdB1LDPicRMTnfiaKJovxF8oX1bQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.5" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "qkQ9V7KFZdTWNThT7ke7E/Jad38s46atSs3QUYZB8f3thBTrcrousdY4Y/tyCtcH5YjsPSiByjuN+L8W/ThMQg==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileSystemGlobbing": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "05Lh2ItSk4mzTdDWATW9nEcSybwprN8Tz42Fs5B+jwdXUpauktdAQUI1Am4sUQi2C63E5hvQp8gXvfwfg9mQGQ==" - }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "1rZwLE+tTUIyZRUzmlk/DQj+v+Eqox+rjb+X7Fi+cYTbQfIZPYwpf1pVybsV3oje8+Pe4GaNukpBVUlPYeQdeQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.Configuration.CommandLine": "9.0.4", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.4", - "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4", - "Microsoft.Extensions.Configuration.Json": "9.0.4", - "Microsoft.Extensions.Configuration.UserSecrets": "9.0.4", - "Microsoft.Extensions.DependencyInjection": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Diagnostics": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Physical": "9.0.4", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Configuration": "9.0.4", - "Microsoft.Extensions.Logging.Console": "9.0.4", - "Microsoft.Extensions.Logging.Debug": "9.0.4", - "Microsoft.Extensions.Logging.EventLog": "9.0.4", - "Microsoft.Extensions.Logging.EventSource": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6vbo3XjyEc+w/kv/Dkfv9NA7iSdIdX5dlU9Shk3wJJ0fiZpCVzVW5FJtNoIePX5hS0ENNpHPClq/qtq06yM4FQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Diagnostics": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" - } - }, - "Microsoft.Extensions.Http.Diagnostics": { - "type": "Transitive", - "resolved": "9.5.0", - "contentHash": "K5VI2QA3Y2s675IyyhA34xKkUK0XZKgXU0ddXOkuCuHiEWLKs/McNVGP1Qw5B5UEGxrei7aj20Ssm+9JJ6yTlg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.5.0", - "Microsoft.Extensions.Http": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5", - "Microsoft.Extensions.Telemetry": "9.5.0" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "rQU61lrgvpE/UgcAd4E56HPxUIkX/VUQCxWmwDTLLVeuwRDYTL0q/FLGfAW17cGTKyCh7ywYAEnY3sTEvURsfg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "WgYTJ1/dxdzqaYYMrgC6cZXJVmaoxUmWgsvR9Kg5ZARpy0LMw7fZIZMIiVuaxhItwwFIW0ruhAN+Er2/oVZgmQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "cI0lQe0js65INCTCtAgnlVJWKgzgoRHVAW1B1zwCbmcliO4IZoTf92f1SYbLeLk7FzMJ/GlCvjLvJegJ6kltmQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Configuration": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "D1jy+jy+huUUxnkZ0H480RZK8vqKn8NsQxYpMpPL/ALPPh1WATVLcr/uXI3RUBB45wMW5265O+hk9x3jnnXFuA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "bApxdklf7QTsONOLR5ow6SdDFXR5ncHvumSEg2+QnCvxvkzc2z5kNn7yQCyupRLRN4jKbnlTkVX8x9qLlwL6Qg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "System.Diagnostics.EventLog": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "R600zTxVJNw2IeAEOvdOJGNA1lHr1m3vo460hSF5G1DjwP0FNpyeH4lpLDMuf34diKwB1LTt5hBw1iF1/iuwsQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "C0VDKwSwNfc3YCLuno6Dip0un9LFmvuSvhpCC4ckpz6nrOmiM5JSJspQiY1dGCDRXJKFeZxa2hDpCLRL8WiBhw==" - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "CJbAVdovKPFh2FoKxesu20odRVSbL/vtvzzObnG+5u38sOfzRS2Ncy25id0TjYUGQzMhNnJUHgTUzTMDl/3c9g==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" - }, - "Microsoft.Extensions.Resilience": { - "type": "Transitive", - "resolved": "9.5.0", - "contentHash": "KoL2rlNW/l+CWfiIFb8ZjBaqgY5DSnla5ZIxBvt5BdkGZ+xoe7ZMEw62FeQ+yot053VEPbPpZ/iTnX3zZ6kB3Q==", - "dependencies": { - "Microsoft.Extensions.Diagnostics": "9.0.5", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "9.5.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5", - "Microsoft.Extensions.Telemetry.Abstractions": "9.5.0", - "Polly.Extensions": "8.4.2", - "Polly.RateLimiting": "8.4.2" - } - }, - "Microsoft.Extensions.Telemetry": { - "type": "Transitive", - "resolved": "9.5.0", - "contentHash": "oaLcdlYgsEl6YAUdwrBHFakGgkHxifOTZQXu6T57OvRm0DByJhn2YyeijUOM2iDIDUJObZhG5A9qL/JNehZydw==", - "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "9.5.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.5.0", - "Microsoft.Extensions.Logging.Configuration": "9.0.5", - "Microsoft.Extensions.ObjectPool": "9.0.5", - "Microsoft.Extensions.Telemetry.Abstractions": "9.5.0" - } - }, - "Microsoft.Extensions.Telemetry.Abstractions": { - "type": "Transitive", - "resolved": "9.5.0", - "contentHash": "vYQAUcMkW06G973ocSzJT5WFWSN7J5l3yZTQF99nUhWP/pJ1SjYBxXXCk/7jqYnBjFJgsmdrP+JxqJio/EvyQQ==", - "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "9.5.0", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.ObjectPool": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" - } - }, - "Microsoft.IdentityModel.Abstractions": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "jNin7yvWZu+K3U24q+6kD+LmGSRfbkHl9Px8hN1XrGwq6ZHgKGi/zuTm5m08G27fwqKfVXIWuIcUeq4Y1VQUOg==" - }, - "Microsoft.IdentityModel.JsonWebTokens": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "4SVXLT8sDG7CrHiszEBrsDYi+aDW0W9d+fuWUGdZPBdan56aM6fGXJDjbI0TVGEDjJhXbACQd8F/BnC7a+m2RQ==", - "dependencies": { - "Microsoft.IdentityModel.Tokens": "8.3.0" - } - }, - "Microsoft.IdentityModel.Logging": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "4w4pSIGHhCCLTHqtVNR2Cc/zbDIUWIBHTZCu/9ZHm2SVwrXY3RJMcZ7EFGiKqmKZMQZJzA0bpwCZ6R8Yb7i5VQ==", - "dependencies": { - "Microsoft.IdentityModel.Abstractions": "8.3.0" - } - }, - "Microsoft.IdentityModel.Tokens": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "yGzqmk+kInH50zeSEH/L1/J0G4/yqTQNq4YmdzOhpE7s/86tz37NS2YbbY2ievbyGjmeBI1mq26QH+yBR6AK3Q==", - "dependencies": { - "Microsoft.IdentityModel.Logging": "8.3.0" - } - }, - "Microsoft.NET.StringTools": { - "type": "Transitive", - "resolved": "17.6.3", - "contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "18.0.1", - "contentHash": "uDJKAEjFTaa2wHdWlfo6ektyoh+WD4/Eesrwb4FpBFKsLGehhACVnwwTI4qD3FrIlIEPlxdXg3SyrYRIcO+RRQ==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.0.1", - "Newtonsoft.Json": "13.0.3" - } - }, - "Microsoft.VisualStudio.Threading.Only": { - "type": "Transitive", - "resolved": "17.13.61", - "contentHash": "vl5a2URJYCO5m+aZZtNlAXAMz28e2pUotRuoHD7RnCWOCeoyd8hWp5ZBaLNYq4iEj2oeJx5ZxiSboAjVmB20Qg==", - "dependencies": { - "Microsoft.VisualStudio.Validation": "17.8.8" - } - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.8.8", - "contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g==" - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.11.90", - "contentHash": "7jrOfU6b/PVBccqzNLfw9u84WWzkSpvWLb2mZxvwdQkOx/V9FXWkmnp/rjOnBFDOhrO/ev4+gQ5QS13FkgNSBA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.VisualStudio.Threading.Only": "17.13.61", - "Microsoft.VisualStudio.Validation": "17.8.8" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "Polly.Extensions": { - "type": "Transitive", - "resolved": "8.5.2", - "contentHash": "NcUEkeMB7LMsLBXzY9PuuKP7ylXngUEuhmaWxCrlXqYLbVQQzG1ulAnaEQ2LM1zlSoxRftAjCuhPIH40qeWAlg==", - "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Polly.Core": "8.5.2" - } - }, - "Polly.RateLimiting": { - "type": "Transitive", - "resolved": "8.4.2", - "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==", - "dependencies": { - "Polly.Core": "8.4.2", - "System.Threading.RateLimiting": "8.0.0" - } - }, - "Reqnroll.Tools.MsBuild.Generation": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "Rqizgmw+N584EheE10HhIAglEofvyb2EbiblTHD6k5BuAm7NoYX7xPmoGy4QiJs09WYnq1R9noEibeZ/JsTqpQ==", - "dependencies": { - "Reqnroll": "[3.0.0]" - } - }, - "StreamJsonRpc": { - "type": "Transitive", - "resolved": "2.21.69", - "contentHash": "WbTpn/PIo+HpFYnsOCiOOe0kHUE2N1eiVRi7MO70DFBTMG3pAOfrgHtwUpOJ37dfDETq/9P9WNIbHom4ABZfrA==", - "dependencies": { - "MessagePack": "2.5.192", - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.VisualStudio.Threading.Only": "17.13.61", - "Microsoft.VisualStudio.Validation": "17.8.8", - "Nerdbank.Streams": "2.11.90", - "Newtonsoft.Json": "13.0.3" - } - }, - "System.ComponentModel.Annotations": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ==" - }, - "System.IdentityModel.Tokens.Jwt": { - "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "9GESpDG0Zb17HD5mBW/uEWi2yz/uKPmCthX2UhyLnk42moGH2FpMgXA2Y4l2Qc7P75eXSUTA6wb/c9D9GSVkzw==", - "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "8.3.0", - "Microsoft.IdentityModel.Tokens": "8.3.0" - } - }, - "System.IO.Hashing": { - "type": "Transitive", - "resolved": "9.0.3", - "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" - }, - "System.Threading.RateLimiting": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q==" - }, - "Validation": { - "type": "Transitive", - "resolved": "2.4.18", - "contentHash": "NfvWJ1QeuZ1FQCkqgXTu1cOkRkbNCfxs4Tat+abXLwom6OXbULVhRGp34BTvVB4XPxj6VIAl7KfLfStXMt/Ehw==" - }, - "xunit.abstractions": { - "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.18.0", - "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" - }, - "xunit.assert": { - "type": "Transitive", - "resolved": "2.9.3", - "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA==" - }, - "xunit.core": { - "type": "Transitive", - "resolved": "2.9.3", - "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", - "dependencies": { - "xunit.extensibility.core": "[2.9.3]", - "xunit.extensibility.execution": "[2.9.3]" - } - }, - "xunit.extensibility.core": { - "type": "Transitive", - "resolved": "2.9.3", - "contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==", - "dependencies": { - "xunit.abstractions": "2.0.3" - } - }, - "xunit.extensibility.execution": { - "type": "Transitive", - "resolved": "2.9.3", - "contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==", - "dependencies": { - "xunit.extensibility.core": "[2.9.3]" - } - }, - "Xunit.SkippableFact": { - "type": "Transitive", - "resolved": "1.4.13", - "contentHash": "IyzZNvJEtXGlXrzxDiSbtH5Lyxf4iJdRQADuyjGdDf00LjXRLJwIoezQNFhFGKTMtvk8IIgaSHxW4mAV4O7b8A==", - "dependencies": { - "Validation": "2.4.18", - "xunit.extensibility.execution": "2.4.0" - } - }, - "workflowframework.dashboard.apphost": { - "type": "Project", - "dependencies": { - "Aspire.Dashboard.Sdk.win-x64": "[9.2.1, )", - "Aspire.Hosting.AppHost": "[9.2.1, )", - "Aspire.Hosting.Orchestration.win-x64": "[9.2.1, )" - } - }, - "Aspire.Hosting.AppHost": { - "type": "CentralTransitive", - "requested": "[9.2.1, )", - "resolved": "9.2.1", - "contentHash": "fnJKXvMD82ma7nEug+b9BZq0zUcyD+TJZei+f7BWkfRrTKznch56P2hNWmQHCRG0ZicTB6SbKuRtVa3i7uFf1Q==", - "dependencies": { - "AspNetCore.HealthChecks.Uris": "9.0.0", - "Aspire.Hosting": "9.2.1", - "Google.Protobuf": "3.30.1", - "Grpc.AspNetCore": "2.70.0", - "Grpc.Net.ClientFactory": "2.70.0", - "Grpc.Tools": "2.71.0", - "Humanizer.Core": "2.14.1", - "JsonPatch.Net": "3.3.0", - "KubernetesClient": "16.0.2", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Diagnostics.HealthChecks": "9.0.4", - "Microsoft.Extensions.Hosting": "9.0.4", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.4", - "Microsoft.Extensions.Http": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4", - "Newtonsoft.Json": "13.0.3", - "Polly.Core": "8.5.2", - "StreamJsonRpc": "2.21.69", - "System.IO.Hashing": "9.0.3" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.5", - "contentHash": "N1Mn0T/tUBPoLL+Fzsp+VCEtneUhhxc1//Dx3BeuQ8AX+XrMlYCfnp2zgpEXnTCB7053CLdiqVWPZ7mEX6MPjg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.5", - "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" - }, - "Microsoft.Extensions.Diagnostics.HealthChecks": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.4", - "contentHash": "jW9lhWQzOOL5sBUCNtAiS6B7tGeLlxJVDjwNuQAQl6dDt9PAAxt3+T2F2jtcvi7KoujgzAdkKQKtGoRaAGlD9w==", - "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "9.0.4", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Hosting.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.5", - "contentHash": "3GA/dxqkP6yFe18qYRgtKYuN2onC8NfhlpNN21jptkVKk7olqBTkdT49oL0pSEz2SptRsux7LocCU7+alGnEag==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.5", - "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[10.0.3, )", - "resolved": "9.0.5", - "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" - } - }, - "Polly.Core": { - "type": "CentralTransitive", - "requested": "[8.6.0, )", - "resolved": "8.5.2", - "contentHash": "1MJKdxv4zwDmiWvYvVN24DsrWUfgQ4F83voH8bhbtLMdPuGy8CfTUzsgQhvyrl1a7hrM6f/ydwLVdVUI0xooUw==" - }, - "YamlDotNet": { - "type": "CentralTransitive", - "requested": "[16.3.0, )", - "resolved": "16.3.0", - "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" - } - } - } -} \ No newline at end of file diff --git a/tests/WorkflowFramework.Tests.E2E/packages.lock.json b/tests/WorkflowFramework.Tests.E2E/packages.lock.json index 38a40b9..dbb4524 100644 --- a/tests/WorkflowFramework.Tests.E2E/packages.lock.json +++ b/tests/WorkflowFramework.Tests.E2E/packages.lock.json @@ -145,7 +145,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -247,7 +248,10 @@ "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" + "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==", + "dependencies": { + "System.Reflection.Metadata": "8.0.0" + } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -276,7 +280,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "System.ClientModel": { @@ -288,16 +293,34 @@ "System.Memory.Data": "8.0.1" } }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, "System.Memory.Data": { "type": "Transitive", "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", "contentHash": "EzimXy5WX7RJxf1pHBfolBApA4GR7qje1cY9XofD4C+cQepx0a5ZVlZjde8NHk+W1+6kltrbbfa8LIOVpTM6yQ==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -349,6 +372,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -371,6 +395,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -451,6 +476,12 @@ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", "Microsoft.Extensions.Primitives": "10.0.3" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" } } } diff --git a/tests/WorkflowFramework.Tests.Integration/packages.lock.json b/tests/WorkflowFramework.Tests.Integration/packages.lock.json index 4200c34..0703f6a 100644 --- a/tests/WorkflowFramework.Tests.Integration/packages.lock.json +++ b/tests/WorkflowFramework.Tests.Integration/packages.lock.json @@ -108,7 +108,10 @@ "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" + "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==", + "dependencies": { + "System.Reflection.Metadata": "8.0.0" + } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -124,6 +127,19 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -182,6 +198,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -253,6 +270,12 @@ "requested": "[8.6.0, )", "resolved": "8.6.0", "contentHash": "3CY5h0gITrx+Ei5JvzZpuYLj0yEJquLeGLT9to4isjR7CN017ePDe1Fyp5bwEytu473CbWYiYDGEeY4uE8Iujw==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" } }, "net8.0": { diff --git a/tests/WorkflowFramework.Tests.Samples/packages.lock.json b/tests/WorkflowFramework.Tests.Samples/packages.lock.json index f0e2d42..bbc2a45 100644 --- a/tests/WorkflowFramework.Tests.Samples/packages.lock.json +++ b/tests/WorkflowFramework.Tests.Samples/packages.lock.json @@ -147,7 +147,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -466,7 +467,10 @@ "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" + "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==", + "dependencies": { + "System.Reflection.Metadata": "8.0.0" + } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -495,7 +499,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "System.ClientModel": { @@ -507,6 +512,11 @@ "System.Memory.Data": "8.0.1" } }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, "System.Diagnostics.EventLog": { "type": "Transitive", "resolved": "10.0.3", @@ -517,11 +527,24 @@ "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", "contentHash": "EzimXy5WX7RJxf1pHBfolBApA4GR7qje1cY9XofD4C+cQepx0a5ZVlZjde8NHk+W1+6kltrbbfa8LIOVpTM6yQ==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -573,6 +596,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -595,6 +619,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -748,6 +773,12 @@ "Microsoft.SemanticKernel.Core": "1.71.0", "OllamaSharp": "5.4.12" } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" } } } diff --git a/tests/WorkflowFramework.Tests/Configuration/YamlWorkflowFullTests.cs b/tests/WorkflowFramework.Tests/Configuration/YamlWorkflowFullTests.cs new file mode 100644 index 0000000..9a6a1ed --- /dev/null +++ b/tests/WorkflowFramework.Tests/Configuration/YamlWorkflowFullTests.cs @@ -0,0 +1,1428 @@ +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using WorkflowFramework.Extensions.Configuration; +using Xunit; + +namespace WorkflowFramework.Tests.Configuration; + +/// +/// Tests for the full YAML workflow definition format covering all step types and +/// the AddYamlWorkflowLoader() DI extension method. +/// +public class YamlWorkflowFullTests +{ + // ── step type ────────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_StepType_WithClassProperty_LoadsAndBuilds() + { + var yaml = """ + name: OrderProcessing + steps: + - name: ValidateOrder + type: step + class: ValidateOrder + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Name.Should().Be("OrderProcessing"); + def.Steps.Should().HaveCount(1); + def.Steps[0].Type.Should().Be("step"); + def.Steps[0].Class.Should().Be("ValidateOrder"); + + var registry = new StepRegistry(); + registry.Register("ValidateOrder", () => new TestStep("ValidateOrder")); + var builder = new WorkflowDefinitionBuilder(registry); + var wf = builder.Build(def); + wf.Steps.Should().HaveCount(1); + } + + // ── conditional type ─────────────────────────────────────────────────────── + + [Fact] + public void Yaml_ConditionalType_WithThenStepsAndElseSteps_LoadsAndBuilds() + { + var yaml = """ + name: PaymentFlow + steps: + - name: PaymentDecision + type: conditional + condition: isValid + thenSteps: + - name: Charge + type: step + class: ChargePayment + elseSteps: + - name: Reject + type: step + class: RejectOrder + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + var step = def.Steps[0]; + step.Type.Should().Be("conditional"); + step.Condition.Should().Be("isValid"); + step.ThenSteps.Should().HaveCount(1); + step.ThenSteps![0].Class.Should().Be("ChargePayment"); + step.ElseSteps.Should().HaveCount(1); + step.ElseSteps![0].Class.Should().Be("RejectOrder"); + + var registry = new StepRegistry(); + registry.Register("ChargePayment", () => new TestStep("ChargePayment")); + registry.Register("RejectOrder", () => new TestStep("RejectOrder")); + var builder = new WorkflowDefinitionBuilder(registry); + var wf = builder.Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public async Task Yaml_ConditionalType_ThenBranch_ExecutesCorrectly() + { + var yaml = """ + name: CondFlow + steps: + - type: conditional + condition: flag + thenSteps: + - type: step + class: ThenStep + elseSteps: + - type: step + class: ElseStep + """; + + var executed = new List(); + var registry = new StepRegistry(); + registry.Register("ThenStep", () => new TrackingStep("ThenStep", executed)); + registry.Register("ElseStep", () => new TrackingStep("ElseStep", executed)); + + var def = new YamlWorkflowDefinitionLoader().Load(yaml); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + + var ctx = new WorkflowContext(); + ctx.Properties["flag"] = true; + await wf.ExecuteAsync(ctx); + + executed.Should().ContainSingle().Which.Should().Be("ThenStep"); + } + + [Fact] + public void Yaml_ConditionalType_WithThenAndElseAsListAliases_LoadsAndBuilds() + { + // 'then:' and 'else:' as YAML sequences are aliases for 'thenSteps:'/'elseSteps:'. + var yaml = """ + name: AliasFlow + steps: + - name: Decision + type: conditional + condition: isValid + then: + - name: Charge + type: step + class: ChargePayment + else: + - name: Reject + type: step + class: RejectOrder + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + var step = def.Steps[0]; + step.Type.Should().Be("conditional"); + step.ThenSteps.Should().HaveCount(1); + step.ThenSteps![0].Class.Should().Be("ChargePayment"); + step.ElseSteps.Should().HaveCount(1); + step.ElseSteps![0].Class.Should().Be("RejectOrder"); + // The scalar 'then'/'else' properties should be null — the sequences were mapped to thenSteps/elseSteps. + step.Then.Should().BeNull(); + step.Else.Should().BeNull(); + + var registry = new StepRegistry(); + registry.Register("ChargePayment", () => new TestStep("ChargePayment")); + registry.Register("RejectOrder", () => new TestStep("RejectOrder")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public async Task Yaml_ConditionalType_ThenListAlias_ExecutesCorrectly() + { + // 'then:' as a list (alias for 'thenSteps:') should route correctly at runtime. + var yaml = """ + name: AliasRunFlow + steps: + - type: conditional + condition: flag + then: + - type: step + class: ThenStep + else: + - type: step + class: ElseStep + """; + + var executed = new List(); + var registry = new StepRegistry(); + registry.Register("ThenStep", () => new TrackingStep("ThenStep", executed)); + registry.Register("ElseStep", () => new TrackingStep("ElseStep", executed)); + + var def = new YamlWorkflowDefinitionLoader().Load(yaml); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + + var ctx = new WorkflowContext(); + ctx.Properties["flag"] = true; + await wf.ExecuteAsync(ctx); + + executed.Should().ContainSingle().Which.Should().Be("ThenStep"); + } + + // ── parallel type ────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_ParallelType_WithStepsList_LoadsAndBuilds() + { + var yaml = """ + name: FulfillmentFlow + steps: + - name: FulfillmentJobs + type: parallel + steps: + - name: SendEmail + type: step + class: SendEmail + - name: UpdateInventory + type: step + class: UpdateInventory + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + var step = def.Steps[0]; + step.Type.Should().Be("parallel"); + step.Steps.Should().HaveCount(2); + + var registry = new StepRegistry(); + registry.Register("SendEmail", () => new TestStep("SendEmail")); + registry.Register("UpdateInventory", () => new TestStep("UpdateInventory")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); // parallel group is a single step + } + + [Fact] + public void Yaml_ParallelType_WithCompositeChild_Builds() + { + // A conditional step nested inside a parallel block should be accepted. + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Type = "parallel", + Steps = + [ + new StepDefinition + { + Type = "conditional", + Condition = "flag", + ThenSteps = [new StepDefinition { Type = "step", Class = "ThenStep" }] + }, + new StepDefinition { Type = "step", Class = "OtherStep" } + ] + } + ] + }; + + var registry = new StepRegistry(); + registry.Register("ThenStep", () => new TestStep("ThenStep")); + registry.Register("OtherStep", () => new TestStep("OtherStep")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + // ── foreach type ─────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_ForEachType_LoadsAndBuilds() + { + var yaml = """ + name: ForEachFlow + steps: + - name: ProcessItems + type: foreach + condition: items + steps: + - type: step + class: ProcessItem + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Type.Should().Be("foreach"); + def.Steps[0].Steps.Should().HaveCount(1); + + var registry = new StepRegistry(); + registry.Register("ProcessItem", () => new TestStep("ProcessItem")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public async Task Yaml_ForEachType_NonGenericCollection_IteratesAllItems() + { + // List is IEnumerable but NOT IEnumerable; the builder should still iterate. + var executed = new List(); + var registry = new StepRegistry(); + registry.Register("ProcessItem", () => new TrackingStep("ProcessItem", executed)); + + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Type = "foreach", + Condition = "items", + Steps = [new StepDefinition { Type = "ProcessItem" }] + } + ] + }; + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + var ctx = new WorkflowContext(); + ctx.Properties["items"] = new List { 1, 2, 3 }; + await wf.ExecuteAsync(ctx); + + executed.Should().HaveCount(3); + } + + // ── while type ───────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_WhileType_LoadsAndBuilds() + { + var yaml = """ + name: WhileFlow + steps: + - name: ProcessLoop + type: while + condition: keepRunning + steps: + - type: step + class: DoWork + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Type.Should().Be("while"); + def.Steps[0].Condition.Should().Be("keepRunning"); + + var registry = new StepRegistry(); + registry.Register("DoWork", () => new TestStep("DoWork")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + // ── dowhile type ─────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_DoWhileType_LoadsAndBuilds() + { + var yaml = """ + name: DoWhileFlow + steps: + - name: DoWhileLoop + type: dowhile + condition: keepRunning + steps: + - type: step + class: DoWork + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Type.Should().Be("dowhile"); + def.Steps[0].Condition.Should().Be("keepRunning"); + + var registry = new StepRegistry(); + registry.Register("DoWork", () => new TestStep("DoWork")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + // ── retry type ───────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_RetryType_LoadsAndBuilds() + { + var yaml = """ + name: RetryFlow + steps: + - name: RetryGroup + type: retry + retry: + maxAttempts: 5 + backoff: exponential + baseDelayMs: 200 + steps: + - type: step + class: FlakyStep + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + var step = def.Steps[0]; + step.Type.Should().Be("retry"); + step.Retry!.MaxAttempts.Should().Be(5); + step.Retry.Backoff.Should().Be("exponential"); + step.Steps.Should().HaveCount(1); + + var registry = new StepRegistry(); + registry.Register("FlakyStep", () => new TestStep("FlakyStep")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public void Yaml_RetryType_WithZeroMaxAttempts_ClampsToOne() + { + // maxAttempts: 0 (or negative) must be clamped to 1 so the body always executes at least once. + var yaml = """ + name: RetryClampFlow + steps: + - name: RetryGroup + type: retry + retry: + maxAttempts: 0 + steps: + - type: step + class: FlakyStep + """; + + var registry = new StepRegistry(); + registry.Register("FlakyStep", () => new TestStep("FlakyStep")); + + var def = new YamlWorkflowDefinitionLoader().Load(yaml); + // Building must not throw and the workflow must contain one step (the RetryGroupStep). + var act = () => new WorkflowDefinitionBuilder(registry).Build(def); + act.Should().NotThrow("maxAttempts=0 is clamped to 1 rather than producing a no-op retry"); + } + + // ── try type ─────────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_TryType_LoadsAndBuilds() + { + var yaml = """ + name: TryFlow + steps: + - name: TryBlock + type: try + steps: + - type: step + class: RiskyStep + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Type.Should().Be("try"); + def.Steps[0].Steps.Should().HaveCount(1); + + var registry = new StepRegistry(); + registry.Register("RiskyStep", () => new TestStep("RiskyStep")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public void Yaml_TryType_WithElseSteps_AsLegacyFinally_LoadsAndBuilds() + { + // This test covers the legacy finally encoding via 'elseSteps' (not the dedicated 'finallySteps' key). + // See Yaml_TryType_WithFinallySteps_LoadsAndBuilds for the new 'finallySteps' path. + var yaml = """ + name: TryFinallyFlow + steps: + - name: TryBlock + type: try + steps: + - type: step + class: RiskyStep + elseSteps: + - type: step + class: CleanupStep + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Steps.Should().HaveCount(1); + def.Steps[0].ElseSteps.Should().HaveCount(1); + def.Steps[0].ElseSteps![0].Class.Should().Be("CleanupStep"); + + var registry = new StepRegistry(); + registry.Register("RiskyStep", () => new TestStep("RiskyStep")); + registry.Register("CleanupStep", () => new TestStep("CleanupStep")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public void Yaml_TryType_WithCatch_LoadsAndBuilds() + { + var yaml = """ + name: TryCatchFlow + steps: + - name: TryBlock + type: try + steps: + - type: step + class: RiskyStep + catch: + - exception: InvalidOperationException + steps: + - type: step + class: HandleError + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Type.Should().Be("try"); + def.Steps[0].Catch.Should().HaveCount(1); + def.Steps[0].Catch![0].Exception.Should().Be("InvalidOperationException"); + def.Steps[0].Catch![0].Steps.Should().HaveCount(1); + + var registry = new StepRegistry(); + registry.Register("RiskyStep", () => new TestStep("RiskyStep")); + registry.Register("HandleError", () => new TestStep("HandleError")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public async Task Yaml_TryType_CatchHandler_ExecutesOnException() + { + var executed = new List(); + var registry = new StepRegistry(); + registry.Register("ThrowStep", () => new ThrowingStep()); + registry.Register("HandleError", () => new TrackingStep("HandleError", executed)); + + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Type = "try", + Steps = [new StepDefinition { Type = "ThrowStep" }], + Catch = + [ + new CatchDefinition + { + Exception = "InvalidOperationException", + Steps = [new StepDefinition { Type = "HandleError" }] + } + ] + } + ] + }; + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + await wf.ExecuteAsync(new WorkflowContext()); + executed.Should().ContainSingle().Which.Should().Be("HandleError"); + } + + // ── subworkflow type ─────────────────────────────────────────────────────── + + [Fact] + public void Yaml_SubworkflowType_WithRegisteredWorkflow_Builds() + { + var yaml = """ + name: MainFlow + steps: + - name: SubFlow + type: subworkflow + subWorkflow: MySubWorkflow + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Type.Should().Be("subworkflow"); + def.Steps[0].SubWorkflow.Should().Be("MySubWorkflow"); + + var subWorkflow = Workflow.Create("MySubWorkflow") + .Step(new TestStep("A")) + .Build(); + + var registry = new StepRegistry(); + var subWorkflows = new Dictionary + { + ["MySubWorkflow"] = subWorkflow + }; + var wf = new WorkflowDefinitionBuilder(registry, subWorkflows).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public void Yaml_SubworkflowType_ThrowsWhenSubWorkflowNotRegistered() + { + var def = new WorkflowDefinition + { + Steps = [new StepDefinition { Type = "subworkflow", SubWorkflow = "Missing" }] + }; + + var registry = new StepRegistry(); + var act = () => new WorkflowDefinitionBuilder(registry).Build(def); + act.Should().Throw() + .WithMessage("*Missing*"); + } + + // ── approval type ────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_ApprovalType_WithRegisteredStep_UsesRegistry() + { + var yaml = """ + name: ApprovalFlow + steps: + - name: HumanReview + type: approval + message: Order requires manager sign-off + requiredApprovers: 1 + timeoutMinutes: 1440 + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + var step = def.Steps[0]; + step.Type.Should().Be("approval"); + step.Message.Should().Be("Order requires manager sign-off"); + step.RequiredApprovers.Should().Be(1); + step.TimeoutMinutes.Should().Be(1440); + + // Build with a registered approval step + var registry = new StepRegistry(); + registry.Register("approval", () => new TestStep("ApprovalStep")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public async Task Yaml_ApprovalType_WithoutRegisteredStep_CreatesFallbackStep() + { + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Name = "Review", + Type = "approval", + Message = "Please review", + RequiredApprovers = 2, + TimeoutMinutes = 60 + } + ] + }; + + var registry = new StepRegistry(); // "approval" not registered + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + + // Execute and verify the fallback step records state in context + var ctx = new WorkflowContext(); + await wf.ExecuteAsync(ctx); + ctx.Properties["Review.Status"].Should().Be("Pending"); + ctx.Properties["Review.RequiredApprovers"].Should().Be(2); + } + + // ── saga type ────────────────────────────────────────────────────────────── + + [Fact] + public void Yaml_SagaType_LoadsAndBuilds() + { + var yaml = """ + name: SagaFlow + steps: + - name: OrderSaga + type: saga + steps: + - type: step + class: ReserveInventory + - type: step + class: ChargeCreditCard + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Type.Should().Be("saga"); + def.Steps[0].Steps.Should().HaveCount(2); + + var registry = new StepRegistry(); + registry.Register("ReserveInventory", () => new TestStep("ReserveInventory")); + registry.Register("ChargeCreditCard", () => new TestStep("ChargeCreditCard")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); // saga is a sub-workflow step + } + + // ── description field ────────────────────────────────────────────────────── + + [Fact] + public void Yaml_WorkflowDescription_IsLoaded() + { + var yaml = """ + name: OrderProcessing + version: 2 + description: Process customer orders end-to-end + steps: [] + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Description.Should().Be("Process customer orders end-to-end"); + } + + // ── class shorthand ──────────────────────────────────────────────────────── + + [Fact] + public void Yaml_ClassOnly_WithoutType_ResolvesAsStep() + { + var def = new WorkflowDefinition + { + Steps = [new StepDefinition { Class = "MyStep" }] + }; + + var registry = new StepRegistry(); + registry.Register("MyStep", () => new TestStep("MyStep")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + // ── full example YAML ────────────────────────────────────────────────────── + + [Fact] + public void Yaml_FullOrderProcessingExample_LoadsAndBuilds() + { + var yaml = """ + name: OrderProcessing + version: 2 + description: Process customer orders end-to-end + steps: + - name: ValidateOrder + type: step + class: ValidateOrder + + - name: PaymentDecision + type: conditional + condition: isValid + thenSteps: + - name: ChargePayment + type: step + class: ChargePayment + elseSteps: + - name: RejectOrder + type: step + class: RejectOrder + + - name: FulfillmentJobs + type: parallel + steps: + - name: SendEmail + type: step + class: SendEmail + - name: UpdateInventory + type: step + class: UpdateInventory + + - name: Complete + type: step + class: CompleteOrder + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Name.Should().Be("OrderProcessing"); + def.Version.Should().Be(2); + def.Description.Should().Be("Process customer orders end-to-end"); + def.Steps.Should().HaveCount(4); + + var registry = new StepRegistry(); + foreach (var name in new[] { "ValidateOrder", "ChargePayment", "RejectOrder", "SendEmail", "UpdateInventory", "CompleteOrder" }) + registry.Register(name, () => new TestStep(name)); + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Name.Should().Be("OrderProcessing"); + wf.Steps.Should().HaveCount(4); + } + + // ── validation / error messages ──────────────────────────────────────────── + + [Fact] + public void Yaml_StepType_WithoutClass_ThrowsClearError() + { + var def = new WorkflowDefinition + { + Steps = [new StepDefinition { Type = "step" }] + }; + + var registry = new StepRegistry(); + var builder = new WorkflowDefinitionBuilder(registry); + var act = () => builder.Build(def); + act.Should().Throw() + .WithMessage("*'step'*'class'*"); + } + + [Fact] + public void Yaml_ConditionalType_WithoutCondition_ThrowsClearError() + { + var def = new WorkflowDefinition + { + Steps = [new StepDefinition { Type = "conditional", ThenSteps = [new StepDefinition { Type = "step", Class = "A" }] }] + }; + + var registry = new StepRegistry(); + registry.Register("A", () => new TestStep("A")); + var builder = new WorkflowDefinitionBuilder(registry); + var act = () => builder.Build(def); + act.Should().Throw() + .WithMessage("*'condition'*"); + } + + [Fact] + public void Yaml_ConditionalType_WithoutThen_ThrowsClearError() + { + var def = new WorkflowDefinition + { + Steps = [new StepDefinition { Type = "conditional", Condition = "flag" }] + }; + + var registry = new StepRegistry(); + var builder = new WorkflowDefinitionBuilder(registry); + var act = () => builder.Build(def); + act.Should().Throw() + .WithMessage("*'then'*"); + } + + [Fact] + public void Yaml_ParallelType_WithEmptySteps_ThrowsClearError() + { + var def = new WorkflowDefinition + { + Steps = [new StepDefinition { Type = "parallel", Steps = [] }] + }; + + var registry = new StepRegistry(); + var builder = new WorkflowDefinitionBuilder(registry); + var act = () => builder.Build(def); + act.Should().Throw() + .WithMessage("*'steps'*"); + } + + [Fact] + public void Yaml_StepWithNoTypeOrClass_ThrowsClearError() + { + var def = new WorkflowDefinition + { + Steps = [new StepDefinition { Name = "Bad" }] + }; + + var registry = new StepRegistry(); + var builder = new WorkflowDefinitionBuilder(registry); + var act = () => builder.Build(def); + act.Should().Throw() + .WithMessage("*'type' or 'class'*"); + } + + // ── round-trip: YAML → JSON → reload → same execution ───────────────────── + + [Fact] + public void RoundTrip_YamlToJson_SameDefinition() + { + var yaml = """ + name: RoundTrip + version: 3 + steps: + - name: StepA + type: step + class: StepA + - name: StepB + type: step + class: StepB + """; + + var yamlLoader = new YamlWorkflowDefinitionLoader(); + var def = yamlLoader.Load(yaml); + + // Serialize to JSON and reload + var json = System.Text.Json.JsonSerializer.Serialize(def, new System.Text.Json.JsonSerializerOptions + { + WriteIndented = true, + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull, + PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase + }); + + var jsonLoader = new JsonWorkflowDefinitionLoader(); + var defFromJson = jsonLoader.Load(json); + + defFromJson.Name.Should().Be(def.Name); + defFromJson.Version.Should().Be(def.Version); + defFromJson.Steps.Should().HaveCount(def.Steps.Count); + for (var i = 0; i < def.Steps.Count; i++) + { + defFromJson.Steps[i].Name.Should().Be(def.Steps[i].Name); + defFromJson.Steps[i].Type.Should().Be(def.Steps[i].Type); + defFromJson.Steps[i].Class.Should().Be(def.Steps[i].Class); + } + } + + [Fact] + public async Task RoundTrip_YamlToJson_SameExecutionBehavior() + { + var yaml = """ + name: ExecRoundTrip + steps: + - name: Track + type: step + class: TrackStep + """; + + var executed = new List(); + + var registry = new StepRegistry(); + registry.Register("TrackStep", () => new TrackingStep("Track", executed)); + + var yamlDef = new YamlWorkflowDefinitionLoader().Load(yaml); + var wfFromYaml = new WorkflowDefinitionBuilder(registry).Build(yamlDef); + + var json = System.Text.Json.JsonSerializer.Serialize(yamlDef, new System.Text.Json.JsonSerializerOptions + { + WriteIndented = false, + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull, + PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase + }); + + var jsonDef = new JsonWorkflowDefinitionLoader().Load(json); + var wfFromJson = new WorkflowDefinitionBuilder(registry).Build(jsonDef); + + // Both workflows should produce the same execution + var ctx1 = new WorkflowContext(); + await wfFromYaml.ExecuteAsync(ctx1); + var tracked1 = new List(executed); + executed.Clear(); + + var ctx2 = new WorkflowContext(); + await wfFromJson.ExecuteAsync(ctx2); + var tracked2 = new List(executed); + + tracked1.Should().BeEquivalentTo(tracked2); + } + + // ── DI extension methods ─────────────────────────────────────────────────── + + [Fact] + public void AddYamlWorkflowLoader_RegistersYamlLoader() + { + var services = new ServiceCollection(); + services.AddYamlWorkflowLoader(); + var provider = services.BuildServiceProvider(); + + var loader = provider.GetRequiredService(); + loader.Should().BeOfType(); + } + + [Fact] + public void AddJsonWorkflowLoader_RegistersJsonLoader() + { + var services = new ServiceCollection(); + services.AddJsonWorkflowLoader(); + var provider = services.BuildServiceProvider(); + + var loader = provider.GetRequiredService(); + loader.Should().BeOfType(); + } + + [Fact] + public void AddStepRegistry_RegistersBothConcreteAndInterface() + { + var services = new ServiceCollection(); + services.AddStepRegistry(); + var provider = services.BuildServiceProvider(); + + provider.GetRequiredService().Should().NotBeNull(); + provider.GetRequiredService().Should().NotBeNull(); + } + + [Fact] + public void AddWorkflowDefinitionBuilder_RegistersBuilder() + { + var services = new ServiceCollection(); + services.AddStepRegistry(); + services.AddWorkflowDefinitionBuilder(); + var provider = services.BuildServiceProvider(); + + provider.GetRequiredService().Should().NotBeNull(); + } + + // ── WorkflowDefinition model fields ─────────────────────────────────────── + + [Fact] + public void StepDefinition_NewFields_HaveCorrectDefaults() + { + var step = new StepDefinition(); + step.Class.Should().BeNull(); + step.ThenSteps.Should().BeNull(); + step.ElseSteps.Should().BeNull(); + step.Message.Should().BeNull(); + step.RequiredApprovers.Should().BeNull(); + step.TimeoutMinutes.Should().BeNull(); + step.Catch.Should().BeNull(); + } + + [Fact] + public void CatchDefinition_Defaults_AreCorrect() + { + var catchDef = new CatchDefinition(); + catchDef.Exception.Should().Be("Exception"); + catchDef.Steps.Should().BeEmpty(); + } + + [Fact] + public void WorkflowDefinition_DescriptionField_DefaultsToNull() + { + var def = new WorkflowDefinition(); + def.Description.Should().BeNull(); + } + + // ── finallySteps field ──────────────────────────────────────────────────── + + [Fact] + public void Yaml_TryType_WithFinallySteps_LoadsAndBuilds() + { + var yaml = """ + name: TryFinallyFlow + steps: + - name: TryBlock + type: try + steps: + - type: step + class: RiskyStep + finallySteps: + - type: step + class: CleanupStep + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].Steps.Should().HaveCount(1); + def.Steps[0].FinallySteps.Should().HaveCount(1); + def.Steps[0].FinallySteps![0].Class.Should().Be("CleanupStep"); + def.Steps[0].ElseSteps.Should().BeNull(); // elseSteps not set + + var registry = new StepRegistry(); + registry.Register("RiskyStep", () => new TestStep("RiskyStep")); + registry.Register("CleanupStep", () => new TestStep("CleanupStep")); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + } + + [Fact] + public void Yaml_TryType_FinallyStepsTakesPrecedenceOverElseSteps() + { + // When both finallySteps and elseSteps are set, finallySteps wins. + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Type = "try", + Steps = [new StepDefinition { Type = "step", Class = "RiskyStep" }], + FinallySteps = [new StepDefinition { Type = "step", Class = "FinallyStep" }], + ElseSteps = [new StepDefinition { Type = "step", Class = "ElseStep" }] + } + ] + }; + + var registry = new StepRegistry(); + registry.Register("RiskyStep", () => new TestStep("RiskyStep")); + registry.Register("FinallyStep", () => new TestStep("FinallyStep")); + // ElseStep is NOT registered — if it were used as the finally body, Build would fail. + var act = () => new WorkflowDefinitionBuilder(registry).Build(def); + act.Should().NotThrow("finallySteps takes precedence over elseSteps"); + } + + // ── snake_case YAML keys ─────────────────────────────────────────────────── + + [Fact] + public void Yaml_SnakeCaseKeys_AreNotSupportedByLoader() + { + // The YAML loader uses CamelCase naming convention. + // Snake_case keys (e.g. required_approvers, timeout_minutes) are silently ignored. + // Authors must use camelCase keys: requiredApprovers, timeoutMinutes. + var yaml = """ + name: ApprovalFlow + steps: + - name: HumanReview + type: approval + message: Review required + required_approvers: 3 + timeout_minutes: 120 + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + // Loader silently ignores unknown keys — values are null/default. + def.Steps[0].RequiredApprovers.Should().BeNull( + "snake_case 'required_approvers' is not recognized; use camelCase 'requiredApprovers'"); + def.Steps[0].TimeoutMinutes.Should().BeNull( + "snake_case 'timeout_minutes' is not recognized; use camelCase 'timeoutMinutes'"); + } + + // ── NamedCompensatingStep ICompensatingStep delegation ──────────────────── + + [Fact] + public async Task NamedStep_WithCompensatingInner_DelegatesCompensate() + { + // When ApplyName wraps a compensating step, a NamedCompensatingStep is returned and + // CompensateAsync must be forwarded to the inner step so saga compensation is not silently lost. + var inner = new CompensatingTestStep("OriginalName"); + var registry = new StepRegistry(); + registry.Register("CompStep", () => inner); + + var def = new WorkflowDefinition + { + Compensation = true, + Steps = + [ + new StepDefinition + { + Name = "RenamedStep", // override name forces NamedCompensatingStep wrapping + Type = "step", + Class = "CompStep" + } + ] + }; + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + wf.Steps[0].Should().BeAssignableTo( + "NamedCompensatingStep wrapping a compensating inner step must implement ICompensatingStep"); + + var comp = (ICompensatingStep)wf.Steps[0]; + var ctx = new WorkflowContext(); + await comp.CompensateAsync(ctx); + inner.Compensated.Should().BeTrue("CompensateAsync must be delegated to the inner compensating step"); + } + + [Fact] + public void NamedStep_WithNonCompensatingInner_DoesNotImplementICompensatingStep() + { + // When ApplyName wraps a non-compensating step, the result should be a plain NamedStep + // that does NOT implement ICompensatingStep — non-compensating steps must not become + // inadvertently compensatable by the mere act of overriding their name. + var registry = new StepRegistry(); + registry.Register("PlainStep", () => new TestStep("OriginalName")); + + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Name = "RenamedPlain", + Type = "step", + Class = "PlainStep" + } + ] + }; + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + wf.Steps[0].Name.Should().Be("RenamedPlain"); + wf.Steps[0].Should().NotBeAssignableTo( + "a plain (non-compensating) step renamed via ApplyName must not acquire ICompensatingStep"); + } + + // ── approval fallback: TimeoutMinutes ───────────────────────────────────── + + [Fact] + public async Task Yaml_ApprovalFallback_RecordsTimeoutMinutes() + { + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Name = "Review", + Type = "approval", + Message = "Please review", + RequiredApprovers = 2, + TimeoutMinutes = 60 + } + ] + }; + + var registry = new StepRegistry(); // "approval" not registered → fallback + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + + var ctx = new WorkflowContext(); + await wf.ExecuteAsync(ctx); + ctx.Properties["Review.TimeoutMinutes"].Should().Be(60); + } + + [Fact] + public void Yaml_ApprovalFallback_UsesMessageAsDefaultStepName_WhenNameOmitted() + { + // Two unnamed approval steps with different messages must produce distinct step names + // so that DefaultWorkflowValidator does not flag a duplicate-step-name error. + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition { Type = "approval", Message = "Manager sign-off" }, + new StepDefinition { Type = "approval", Message = "Director approval" } + ] + }; + + var registry = new StepRegistry(); // "approval" not registered → fallback + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + + wf.Steps.Should().HaveCount(2); + wf.Steps[0].Name.Should().Be("Manager sign-off"); + wf.Steps[1].Name.Should().Be("Director approval"); + wf.Steps[0].Name.Should().NotBe(wf.Steps[1].Name, + "two unnamed approval steps with different messages must not collide"); + } + + // ── timeoutSeconds ──────────────────────────────────────────────────────── + + [Fact] + public async Task Yaml_StepType_WithTimeoutSeconds_FaultsWithTimeoutException_WhenStepExceedsLimit() + { + var registry = new StepRegistry(); + registry.Register("SlowStep", () => new SlowStep(TimeSpan.FromSeconds(10))); + + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Name = "SlowOp", + Type = "step", + Class = "SlowStep", + TimeoutSeconds = 0.05 // 50 ms — the step takes 10 s so it will time out + } + ] + }; + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + wf.Steps[0].Name.Should().Be("SlowOp", "the configured name is preserved on the timeout wrapper"); + + var ctx = new WorkflowContext(); + var result = await wf.ExecuteAsync(ctx); + result.Status.Should().Be(WorkflowStatus.Faulted); + result.Errors.Should().ContainSingle() + .Which.Exception.Should().BeOfType(); + } + + [Fact] + public async Task Yaml_StepType_WithoutTimeoutSeconds_CompletesNormally() + { + var executed = new List(); + var registry = new StepRegistry(); + registry.Register("QuickStep", () => new TrackingStep("QuickStep", executed)); + + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Name = "QuickOp", + Type = "step", + Class = "QuickStep" + // TimeoutSeconds intentionally omitted + } + ] + }; + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + await wf.ExecuteAsync(new WorkflowContext()); + executed.Should().ContainSingle().Which.Should().Be("QuickStep"); + } + + [Fact] + public void Yaml_TimeoutSeconds_LoadsAndBuilds() + { + var yaml = """ + name: TimeoutFlow + steps: + - name: SlowOp + type: step + class: SlowStep + timeoutSeconds: 0.1 + """; + + var loader = new YamlWorkflowDefinitionLoader(); + var def = loader.Load(yaml); + + def.Steps[0].TimeoutSeconds.Should().BeApproximately(0.1, 0.001); + + var registry = new StepRegistry(); + registry.Register("SlowStep", () => new SlowStep(TimeSpan.FromSeconds(10))); + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + wf.Steps.Should().HaveCount(1); + wf.Steps[0].Name.Should().Be("SlowOp"); + } + + // ── InlineWorkflowStep failure propagation ──────────────────────────────── + + [Fact] + public async Task Conditional_BranchFailure_AbortsOuterWorkflow() + { + // A failing step inside a conditional Then-branch must not be silently swallowed. + // Before the fix, InlineWorkflowStep returned the sub-workflow result without checking + // it, so the outer workflow would complete normally even when a branch step threw. + var registry = new StepRegistry(); + registry.Register("BadStep", () => new ThrowingStep()); + + var subsequentExecuted = new List(); + registry.Register("AfterStep", () => new TrackingStep("AfterStep", subsequentExecuted)); + + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Type = "conditional", + Condition = "isActive", // property key — must be set in context to trigger branch + ThenSteps = [new StepDefinition { Type = "step", Class = "BadStep" }] + }, + // This step must NOT execute if the conditional branch failed + new StepDefinition { Type = "step", Class = "AfterStep" } + ] + }; + + var ctx = new WorkflowContext(); + ctx.Properties["isActive"] = true; // ensure the Then-branch executes + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + var result = await wf.ExecuteAsync(ctx); + + result.Status.Should().NotBe(WorkflowStatus.Completed, + "a failing branch step must prevent the outer workflow from completing normally"); + subsequentExecuted.Should().BeEmpty( + "subsequent steps must not run after a failed conditional branch"); + } + + // ── TimeoutStepWrapper wall-clock enforcement ───────────────────────────── + + [Fact] + public async Task Timeout_WallClock_EnforcedEvenWhenStepIgnoresCancellationToken() + { + // Verifies that TimeoutStepWrapper enforces the wall-clock timeout via Task.WhenAny even + // when the inner step does not observe its CancellationToken (cooperative cancellation alone + // would not stop such a step within the configured timeout). + var registry = new StepRegistry(); + registry.Register("IgnorantStep", () => new CancellationIgnorantSlowStep()); + + var def = new WorkflowDefinition + { + Steps = + [ + new StepDefinition + { + Name = "Slow", + Type = "step", + Class = "IgnorantStep", + TimeoutSeconds = 0.1 // 100 ms + } + ] + }; + + var wf = new WorkflowDefinitionBuilder(registry).Build(def); + var result = await wf.ExecuteAsync(new WorkflowContext()); + + result.Status.Should().Be(WorkflowStatus.Faulted); + result.Errors.Should().ContainSingle() + .Which.Exception.Should().BeOfType(); + } + + // ── helpers ──────────────────────────────────────────────────────────────── + + private sealed class TestStep(string name) : IStep + { + public string Name => name; + public Task ExecuteAsync(IWorkflowContext context) => Task.CompletedTask; + } + + private sealed class TrackingStep(string name, List log) : IStep + { + public string Name => name; + public Task ExecuteAsync(IWorkflowContext context) + { + log.Add(name); + return Task.CompletedTask; + } + } + + private sealed class ThrowingStep : IStep + { + public string Name => "ThrowStep"; + public Task ExecuteAsync(IWorkflowContext context) => + throw new InvalidOperationException("Simulated failure"); + } + + private sealed class SlowStep(TimeSpan delay) : IStep + { + public string Name => "SlowStep"; + public Task ExecuteAsync(IWorkflowContext context) => + Task.Delay(delay, context.CancellationToken); + } + + /// + /// A step that does NOT observe the CancellationToken — used to verify that + /// TimeoutStepWrapper enforces wall-clock timeouts even for uncooperative steps. + /// + private sealed class CancellationIgnorantSlowStep : IStep + { + public string Name => "IgnorantStep"; + public Task ExecuteAsync(IWorkflowContext context) => + Task.Delay(TimeSpan.FromSeconds(30)); // intentionally ignores context.CancellationToken + } + + private sealed class CompensatingTestStep(string name) : ICompensatingStep + { + public bool Compensated { get; private set; } + public string Name => name; + public Task ExecuteAsync(IWorkflowContext context) => Task.CompletedTask; + public Task CompensateAsync(IWorkflowContext context) + { + Compensated = true; + return Task.CompletedTask; + } + } +} diff --git a/tests/WorkflowFramework.Tests/packages.lock.json b/tests/WorkflowFramework.Tests/packages.lock.json index 8eb4f9a..df8217a 100644 --- a/tests/WorkflowFramework.Tests/packages.lock.json +++ b/tests/WorkflowFramework.Tests/packages.lock.json @@ -117,7 +117,10 @@ "Azure.Core": "1.38.0", "Microsoft.Identity.Client": "4.61.3", "Microsoft.Identity.Client.Extensions.Msal": "4.61.3", - "System.Security.Cryptography.ProtectedData": "4.7.0" + "System.Memory": "4.5.4", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" } }, "Castle.Core": { @@ -148,6 +151,11 @@ "resolved": "18.0.1", "contentHash": "O+utSr97NAJowIQT/OVp3Lh9QgW/wALVTP4RG1m2AfFP4IyJmJz0ZBmFJUsRQiAPgq6IRC0t8AAzsiPIsaUDEA==" }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, "Microsoft.Data.SqlClient": { "type": "Transitive", "resolved": "5.1.6", @@ -160,7 +168,12 @@ "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", "Microsoft.SqlServer.Server": "1.0.0", "System.Configuration.ConfigurationManager": "6.0.1", - "System.Runtime.Caching": "6.0.0" + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Runtime.Caching": "6.0.0", + "System.Security.Cryptography.Cng": "5.0.0", + "System.Security.Principal.Windows": "5.0.0", + "System.Text.Encoding.CodePages": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" } }, "Microsoft.Data.SqlClient.SNI.runtime": { @@ -210,7 +223,8 @@ "dependencies": { "Microsoft.Extensions.AI.Abstractions": "10.0.1", "OpenAI": "2.7.0", - "System.Memory.Data": "10.0.0" + "System.Memory.Data": "10.0.0", + "System.Text.Json": "10.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -291,7 +305,8 @@ "resolved": "4.61.3", "contentHash": "naJo/Qm35Caaoxp5utcw+R8eU8ZtLz2ALh8S+gkekOYQ1oazfCQMWVT4NJ/FnHzdIJlm8dMz0oMpMGCabx5odA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0" + "Microsoft.IdentityModel.Abstractions": "6.35.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" } }, "Microsoft.Identity.Client.Extensions.Msal": { @@ -313,7 +328,10 @@ "resolved": "6.35.0", "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.35.0" + "Microsoft.IdentityModel.Tokens": "6.35.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2" } }, "Microsoft.IdentityModel.Logging": { @@ -347,9 +365,21 @@ "resolved": "6.35.0", "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", "dependencies": { - "Microsoft.IdentityModel.Logging": "6.35.0" + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.35.0", + "System.Security.Cryptography.Cng": "4.5.0" } }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, "Microsoft.SemanticKernel.Abstractions": { "type": "Transitive", "resolved": "1.71.0", @@ -403,7 +433,10 @@ "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" + "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==", + "dependencies": { + "System.Reflection.Metadata": "8.0.0" + } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -429,7 +462,8 @@ "resolved": "2.7.0", "contentHash": "zodE/lrDzSUxgFzuHP+fiR56VBQZyy3H7le8VH9fiuB8SCgs7YSKpK/pwSpYZln3HVX6RyPDuALIOVPQMhnRFQ==", "dependencies": { - "System.ClientModel": "1.8.1" + "System.ClientModel": "1.8.1", + "System.Net.ServerSentEvents": "9.0.9" } }, "SQLitePCLRaw.bundle_e_sqlite3": { @@ -444,7 +478,10 @@ "SQLitePCLRaw.core": { "type": "Transitive", "resolved": "2.1.10", - "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", + "dependencies": { + "System.Memory": "4.5.3" + } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", @@ -468,6 +505,11 @@ "System.Memory.Data": "8.0.1" } }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "6.0.1", @@ -490,6 +532,11 @@ "Microsoft.Win32.SystemEvents": "6.0.0" } }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "9.0.6", + "contentHash": "8LbKs3WVqyDSszFZJA9Uxg9z+C6WbPbFTSPm/HjFEsWx49XWs0ueqaAKPWncvFJ8yl4H4C/RTnUMhCKoXkddkg==" + }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", "resolved": "6.35.0", @@ -499,16 +546,43 @@ "Microsoft.IdentityModel.Tokens": "6.35.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, "System.Memory.Data": { "type": "Transitive", "resolved": "10.0.0", "contentHash": "r+m+05b+TndDQIN6/yMkotk7wNsUPpYgLKOac8QR9DdU9gcPTJIU1RoyXY8otCqPxH55XF4hewEt6lJu0lSz3Q==" }, + "System.Net.ServerSentEvents": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zEISfefh8BYD5m+GMsYJnodiTaz2fDBEOrLgYH7VsQhMIzNkcuSsg9Df/d3zywYX5ohCyCJ5AOax50XLKnXyjw==" + }, "System.Numerics.Tensors": { "type": "Transitive", "resolved": "10.0.2", "contentHash": "EzimXy5WX7RJxf1pHBfolBApA4GR7qje1cY9XofD4C+cQepx0a5ZVlZjde8NHk+W1+6kltrbbfa8LIOVpTM6yQ==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, "System.Runtime.Caching": { "type": "Transitive", "resolved": "6.0.0", @@ -517,6 +591,24 @@ "System.Configuration.ConfigurationManager": "6.0.0" } }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==", + "dependencies": { + "System.Formats.Asn1": "5.0.0" + } + }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "6.0.0", @@ -527,9 +619,46 @@ "resolved": "6.0.0", "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", "dependencies": { + "System.Security.AccessControl": "6.0.0", "System.Windows.Extensions": "6.0.0" } }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, "System.Windows.Extensions": { "type": "Transitive", "resolved": "6.0.0", @@ -589,6 +718,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )", "WorkflowFramework.Extensions.AI": "[1.0.0, )" } @@ -617,6 +747,8 @@ "workflowframework.extensions.configuration": { "type": "Project", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )", "YamlDotNet": "[16.3.0, )" } @@ -645,6 +777,7 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -658,6 +791,7 @@ "workflowframework.extensions.datamapping.schema": { "type": "Project", "dependencies": { + "System.Text.Json": "[10.0.1, )", "WorkflowFramework.Extensions.DataMapping": "[1.0.0, )" } }, @@ -672,12 +806,14 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", + "System.Diagnostics.DiagnosticSource": "[10.0.3, )", "WorkflowFramework": "[1.0.0, )" } }, "workflowframework.extensions.distributed": { "type": "Project", "dependencies": { + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -686,6 +822,7 @@ "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", "Npgsql": "[9.0.3, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework.Extensions.Distributed": "[1.0.0, )" } }, @@ -747,6 +884,7 @@ "dependencies": { "Microsoft.EntityFrameworkCore": "[9.0.6, )", "Microsoft.EntityFrameworkCore.Relational": "[9.0.6, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -768,6 +906,7 @@ "type": "Project", "dependencies": { "Microsoft.Data.Sqlite": "[9.0.6, )", + "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )" } }, @@ -874,7 +1013,9 @@ "Microsoft.EntityFrameworkCore.Relational": "9.0.6", "Microsoft.Extensions.Caching.Memory": "9.0.6", "Microsoft.Extensions.Configuration.Abstractions": "9.0.6", - "Microsoft.Extensions.Logging": "9.0.6" + "Microsoft.Extensions.Logging": "9.0.6", + "System.Formats.Asn1": "9.0.6", + "System.Text.Json": "9.0.6" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { @@ -953,6 +1094,18 @@ "resolved": "8.6.0", "contentHash": "3CY5h0gITrx+Ei5JvzZpuYLj0yEJquLeGLT9to4isjR7CN017ePDe1Fyp5bwEytu473CbWYiYDGEeY4uE8Iujw==" }, + "System.Diagnostics.DiagnosticSource": { + "type": "CentralTransitive", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[10.0.1, )", + "resolved": "10.0.1", + "contentHash": "EsgwDgU1PFqhrFA9l5n+RBu76wFhNGCEwu8ITrBNhjPP3MxLyklroU5GIF8o6JYpYg6T4KD/VICfMdgPAvNp5g==" + }, "YamlDotNet": { "type": "CentralTransitive", "requested": "[16.3.0, )", @@ -1627,6 +1780,7 @@ "workflowframework.extensions.configuration": { "type": "Project", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )", "YamlDotNet": "[16.3.0, )" @@ -2660,6 +2814,7 @@ "workflowframework.extensions.configuration": { "type": "Project", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.3, )", "System.Text.Json": "[10.0.1, )", "WorkflowFramework": "[1.0.0, )", "YamlDotNet": "[16.3.0, )"