Skip to content

Commit 0dee5c3

Browse files
authored
Merge pull request #435 from serverlessworkflow/feat-external-catalog-support
Added support for custom functions defined in external catalogs
2 parents 1bd0e54 + 3b6697a commit 0dee5c3

File tree

20 files changed

+80
-35
lines changed

20 files changed

+80
-35
lines changed

src/api/Synapse.Api.Application/Synapse.Api.Application.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

src/api/Synapse.Api.Client.Core/Synapse.Api.Client.Core.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

src/api/Synapse.Api.Client.Http/Synapse.Api.Client.Http.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>
@@ -43,7 +43,7 @@
4343

4444
<ItemGroup>
4545
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.10" />
46-
<PackageReference Include="ServerlessWorkflow.Sdk.IO" Version="1.0.0-alpha4.1" />
46+
<PackageReference Include="ServerlessWorkflow.Sdk.IO" Version="1.0.0-alpha5" />
4747
<PackageReference Include="System.Reactive" Version="6.0.1" />
4848
</ItemGroup>
4949

src/api/Synapse.Api.Http/Synapse.Api.Http.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<OutputType>Library</OutputType>
99
<GenerateDocumentationFile>True</GenerateDocumentationFile>
1010
<VersionPrefix>1.0.0</VersionPrefix>
11-
<VersionSuffix>alpha4.1</VersionSuffix>
11+
<VersionSuffix>alpha5</VersionSuffix>
1212
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1313
<FileVersion>$(VersionPrefix)</FileVersion>
1414
<Authors>The Synapse Authors</Authors>

src/api/Synapse.Api.Server/Synapse.Api.Server.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

src/cli/Synapse.Cli/Synapse.Cli.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<NeutralLanguage>en</NeutralLanguage>
99
<GenerateDocumentationFile>True</GenerateDocumentationFile>
1010
<VersionPrefix>1.0.0</VersionPrefix>
11-
<VersionSuffix>alpha4.1</VersionSuffix>
11+
<VersionSuffix>alpha5</VersionSuffix>
1212
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1313
<FileVersion>$(VersionPrefix)</FileVersion>
1414
<Authors>The Synapse Authors</Authors>
@@ -33,7 +33,7 @@
3333
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.2" />
3434
<PackageReference Include="moment.net" Version="1.3.4" />
3535
<PackageReference Include="NetEscapades.Configuration.Yaml" Version="3.1.0" />
36-
<PackageReference Include="ServerlessWorkflow.Sdk.IO" Version="1.0.0-alpha4.1" />
36+
<PackageReference Include="ServerlessWorkflow.Sdk.IO" Version="1.0.0-alpha5" />
3737
<PackageReference Include="Spectre.Console" Version="0.49.1" />
3838
<PackageReference Include="System.CommandLine.NamingConventionBinder" Version="2.0.0-beta4.22272.1" />
3939
</ItemGroup>

src/core/Synapse.Core.Infrastructure.Containers.Docker/Synapse.Core.Infrastructure.Containers.Docker.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

src/core/Synapse.Core.Infrastructure.Containers.Kubernetes/Synapse.Core.Infrastructure.Containers.Kubernetes.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

src/core/Synapse.Core.Infrastructure/Synapse.Core.Infrastructure.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>
@@ -50,7 +50,7 @@
5050
<PackageReference Include="Neuroglia.Data.Infrastructure.ResourceOriented.Redis" Version="4.15.8" />
5151
<PackageReference Include="Neuroglia.Mediation" Version="4.15.8" />
5252
<PackageReference Include="Neuroglia.Plugins" Version="4.15.8" />
53-
<PackageReference Include="ServerlessWorkflow.Sdk.IO" Version="1.0.0-alpha4.1" />
53+
<PackageReference Include="ServerlessWorkflow.Sdk.IO" Version="1.0.0-alpha5" />
5454
</ItemGroup>
5555

5656
<ItemGroup>

src/core/Synapse.Core/Synapse.Core.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>
@@ -69,7 +69,7 @@
6969
<PackageReference Include="Neuroglia.Data.Infrastructure.ResourceOriented" Version="4.15.8" />
7070
<PackageReference Include="Neuroglia.Eventing.CloudEvents" Version="4.15.8" />
7171
<PackageReference Include="Semver" Version="2.3.0" />
72-
<PackageReference Include="ServerlessWorkflow.Sdk" Version="1.0.0-alpha4.1" />
72+
<PackageReference Include="ServerlessWorkflow.Sdk" Version="1.0.0-alpha5" />
7373
</ItemGroup>
7474

7575
</Project>

src/correlator/Synapse.Correlator/Synapse.Correlator.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<NeutralLanguage>en</NeutralLanguage>
99
<GenerateDocumentationFile>True</GenerateDocumentationFile>
1010
<VersionPrefix>1.0.0</VersionPrefix>
11-
<VersionSuffix>alpha4.1</VersionSuffix>
11+
<VersionSuffix>alpha5</VersionSuffix>
1212
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1313
<FileVersion>$(VersionPrefix)</FileVersion>
1414
<Authors>The Synapse Authors</Authors>

src/operator/Synapse.Operator/Synapse.Operator.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<NeutralLanguage>en</NeutralLanguage>
99
<GenerateDocumentationFile>True</GenerateDocumentationFile>
1010
<VersionPrefix>1.0.0</VersionPrefix>
11-
<VersionSuffix>alpha4.1</VersionSuffix>
11+
<VersionSuffix>alpha5</VersionSuffix>
1212
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1313
<FileVersion>$(VersionPrefix)</FileVersion>
1414
<Authors>The Synapse Authors</Authors>

src/runner/Synapse.Runner/Services/Executors/FunctionCallExecutor.cs

+56-11
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
using Neuroglia;
1515
using Neuroglia.Data.Expressions;
16+
using Semver;
1617

1718
namespace Synapse.Runner.Services.Executors;
1819

@@ -34,6 +35,8 @@ public class FunctionCallExecutor(IServiceProvider serviceProvider, ILogger<Func
3435
{
3536

3637
const string CustomFunctionDefinitionFile = "function.yaml";
38+
const string GithubHost = "github.com";
39+
const string GitlabHost = "gitlab";
3740

3841
/// <summary>
3942
/// Gets the service used to serialize/deserialize objects to/from YAML
@@ -55,7 +58,7 @@ public override async Task InitializeAsync(CancellationToken cancellationToken =
5558
{
5659
await base.InitializeAsync(cancellationToken).ConfigureAwait(false);
5760
if (this.Task.Workflow.Definition.Use?.Functions?.TryGetValue(this.Task.Definition.Call, out var function) == true && function != null) this.Function = function;
58-
else if (Uri.TryCreate(this.Task.Definition.Call, UriKind.Absolute, out var uri) && (uri.IsFile || !string.IsNullOrWhiteSpace(uri.Host))) this.Function = await this.GetCustomFunctionAsync(uri, cancellationToken).ConfigureAwait(false);
61+
else if (Uri.TryCreate(this.Task.Definition.Call, UriKind.Absolute, out var uri) && (uri.IsFile || !string.IsNullOrWhiteSpace(uri.Host))) this.Function = await this.GetCustomFunctionAsync(new() { Uri = uri }, cancellationToken).ConfigureAwait(false);
5962
else if (this.Task.Definition.Call.Contains('@'))
6063
{
6164
var components = this.Task.Definition.Call.Split('@', StringSplitOptions.RemoveEmptyEntries);
@@ -68,24 +71,30 @@ public override async Task InitializeAsync(CancellationToken cancellationToken =
6871
/// <summary>
6972
/// Gets the custom function at the specified uri
7073
/// </summary>
71-
/// <param name="uri">The uri of that references the custom function to get</param>
74+
/// <param name="endpoint">The uri of that references the custom function to get</param>
7275
/// <param name="cancellationToken">A <see cref="CancellationToken"/></param>
7376
/// <returns>The <see cref="TaskDefinition"/> of the custom function defined at the specified uri</returns>
74-
protected virtual async Task<TaskDefinition> GetCustomFunctionAsync(Uri uri, CancellationToken cancellationToken = default)
77+
protected virtual async Task<TaskDefinition> GetCustomFunctionAsync(EndpointDefinition endpoint, CancellationToken cancellationToken = default)
7578
{
76-
ArgumentNullException.ThrowIfNull(uri);
79+
ArgumentNullException.ThrowIfNull(endpoint);
80+
var uri = endpoint.Uri;
7781
if (!uri.OriginalString.EndsWith(CustomFunctionDefinitionFile)) uri = new Uri(uri, CustomFunctionDefinitionFile);
82+
if (uri.Host.Equals(GithubHost, StringComparison.OrdinalIgnoreCase)) uri = this.TransformGithubUriToRawUri(uri);
83+
else if (uri.Host.Contains(GitlabHost)) uri = this.TransformGitlabUriToRawUri(uri);
84+
var authentication = endpoint.Authentication == null ? null : await this.Task.Workflow.Expressions.EvaluateAsync<AuthenticationPolicyDefinition>(endpoint.Authentication, this.Task.Input, this.Task.Arguments, cancellationToken).ConfigureAwait(false);
85+
using var httpClient = this.ServiceProvider.GetRequiredService<IHttpClientFactory>().CreateClient();
86+
await httpClient.ConfigureAuthenticationAsync(this.Task.Workflow.Definition, authentication, this.ServiceProvider, cancellationToken).ConfigureAwait(false);
7887
try
7988
{
80-
using var response = await this.HttpClient.GetAsync(uri, cancellationToken).ConfigureAwait(false);
89+
using var response = await httpClient.GetAsync(uri, cancellationToken).ConfigureAwait(false);
8190
response.EnsureSuccessStatusCode();
8291
var yaml = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
8392
var function = this.YamlSerializer.Deserialize<TaskDefinition>(yaml)!;
8493
return function;
8594
}
8695
catch(Exception ex)
8796
{
88-
throw new ProblemDetailsException(new(ErrorType.Communication, ErrorTitle.Communication, ErrorStatus.Communication, $"Failed to load the custom function defined at '{uri}': {ex.Message}"));
97+
throw new ProblemDetailsException(new(ErrorType.Communication, ErrorTitle.Communication, ErrorStatus.Communication, $"Failed to load the custom function defined at '{endpoint}': {ex.Message}"));
8998
}
9099
}
91100

@@ -100,16 +109,52 @@ protected virtual async Task<TaskDefinition> GetCustomFunctionAsync(string funct
100109
{
101110
ArgumentException.ThrowIfNullOrWhiteSpace(functionName);
102111
ArgumentException.ThrowIfNullOrWhiteSpace(catalogName);
112+
var components = functionName.Split(':', StringSplitOptions.RemoveEmptyEntries);
113+
if (components.Length != 2) throw new Exception($"The specified value '{functionName}' is not a valid custom function qualified name ({{name}}:{{version}})");
114+
var name = components[0];
115+
var version = components[1];
116+
if (!SemVersion.TryParse(version, SemVersionStyles.Strict, out _)) throw new Exception($"The specified value '{version}' is not a valid semantic version 2.0");
103117
if (catalogName == SynapseDefaults.Tasks.CustomFunctions.Catalogs.Default)
104118
{
105-
var components = functionName.Split(':', StringSplitOptions.RemoveEmptyEntries);
106-
if (components.Length != 2) throw new Exception($"The specified value '{functionName}' is not a valid custom function qualified name ({{name}}:{{version}})");
107-
var name = components[0];
108-
var version = components[1];
109119
var function = await this.Task.Workflow.CustomFunctions.GetAsync(name, cancellationToken).ConfigureAwait(false) ?? throw new NullReferenceException($"Failed to find the specified custom function '{name}'");
110120
return function.Spec.Versions.Get(version) ?? throw new NullReferenceException($"Failed to find the version '{version}' of the custom function '{name}'");
111121
}
112-
else throw new NotImplementedException("Using non-default custom function catalog is not yet implemented"); //todo: implement
122+
else
123+
{
124+
if (this.Task.Workflow.Definition.Use?.Catalogs?.TryGetValue(catalogName, out var catalog) != true || catalog == null) throw new NullReferenceException($"Failed to find a catalog with the specified name '{catalogName}'");
125+
return await this.GetCustomFunctionAsync(new()
126+
{
127+
Uri = new(catalog.Endpoint.Uri, $"/functions/{name}/{version}"),
128+
Authentication = catalog.Endpoint.Authentication
129+
}, cancellationToken).ConfigureAwait(false);
130+
}
131+
}
132+
133+
/// <summary>
134+
/// Transforms the specified Github content <see cref="Uri"/> into a Github raw content <see cref="Uri"/>
135+
/// </summary>
136+
/// <param name="uri">The <see cref="Uri"/> to transform</param>
137+
/// <returns>The Github raw content <see cref="Uri"/></returns>
138+
protected virtual Uri TransformGithubUriToRawUri(Uri uri)
139+
{
140+
ArgumentNullException.ThrowIfNull(uri);
141+
if (uri.Host.Equals(GithubHost, StringComparison.OrdinalIgnoreCase)) return uri;
142+
var rawUri = uri.AbsoluteUri.Replace(GithubHost, "raw.githubusercontent.com", StringComparison.OrdinalIgnoreCase);
143+
rawUri = rawUri.Replace("/tree/", "/refs/heads/", StringComparison.OrdinalIgnoreCase);
144+
return new(rawUri, UriKind.Absolute);
145+
}
146+
147+
/// <summary>
148+
/// Transforms the specified Gitlab content <see cref="Uri"/> into a Gitlab raw content <see cref="Uri"/>
149+
/// </summary>
150+
/// <param name="uri">The <see cref="Uri"/> to transform</param>
151+
/// <returns>The Gitlab raw content <see cref="Uri"/></returns>
152+
protected virtual Uri TransformGitlabUriToRawUri(Uri uri)
153+
{
154+
ArgumentNullException.ThrowIfNull(uri);
155+
if (!uri.AbsoluteUri.Contains(GitlabHost, StringComparison.OrdinalIgnoreCase)) return uri;
156+
var rawUri = uri.AbsoluteUri.Replace("/-/blob/", "/-/raw/", StringComparison.OrdinalIgnoreCase);
157+
return new(rawUri, UriKind.Absolute);
113158
}
114159

115160
/// <inheritdoc/>

src/runner/Synapse.Runner/Synapse.Runner.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<NeutralLanguage>en</NeutralLanguage>
99
<GenerateDocumentationFile>True</GenerateDocumentationFile>
1010
<VersionPrefix>1.0.0</VersionPrefix>
11-
<VersionSuffix>alpha4.1</VersionSuffix>
11+
<VersionSuffix>alpha5</VersionSuffix>
1212
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1313
<FileVersion>$(VersionPrefix)</FileVersion>
1414
<Authors>The Synapse Authors</Authors>

src/runtime/Synapse.Runtime.Abstractions/Synapse.Runtime.Abstractions.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

src/runtime/Synapse.Runtime.Docker/Synapse.Runtime.Docker.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

src/runtime/Synapse.Runtime.Kubernetes/Synapse.Runtime.Kubernetes.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

src/runtime/Synapse.Runtime.Native/Synapse.Runtime.Native.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<NeutralLanguage>en</NeutralLanguage>
88
<GenerateDocumentationFile>True</GenerateDocumentationFile>
99
<VersionPrefix>1.0.0</VersionPrefix>
10-
<VersionSuffix>alpha4.1</VersionSuffix>
10+
<VersionSuffix>alpha5</VersionSuffix>
1111
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
1212
<FileVersion>$(VersionPrefix)</FileVersion>
1313
<Authors>The Synapse Authors</Authors>

tests/Synapse.IntegrationTests/Synapse.IntegrationTests.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<PackageReference Include="FluentAssertions" Version="6.12.1" />
1818
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.10" />
1919
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
20-
<PackageReference Include="ServerlessWorkflow.Sdk.Builders" Version="1.0.0-alpha4.1" />
20+
<PackageReference Include="ServerlessWorkflow.Sdk.Builders" Version="1.0.0-alpha5" />
2121
<PackageReference Include="Testcontainers" Version="3.10.0" />
2222
<PackageReference Include="xunit" Version="2.9.2" />
2323
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">

tests/Synapse.UnitTests/Synapse.UnitTests.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
<PackageReference Include="Neuroglia.Data.Expressions.JQ" Version="4.15.8" />
2323
<PackageReference Include="Neuroglia.Data.Infrastructure.Memory" Version="4.15.8" />
2424
<PackageReference Include="Neuroglia.Data.Infrastructure.ResourceOriented.Redis" Version="4.15.8" />
25-
<PackageReference Include="ServerlessWorkflow.Sdk.Builders" Version="1.0.0-alpha4.1" />
26-
<PackageReference Include="ServerlessWorkflow.Sdk.IO" Version="1.0.0-alpha4.1" />
25+
<PackageReference Include="ServerlessWorkflow.Sdk.Builders" Version="1.0.0-alpha5" />
26+
<PackageReference Include="ServerlessWorkflow.Sdk.IO" Version="1.0.0-alpha5" />
2727
<PackageReference Include="Testcontainers" Version="3.10.0" />
2828
<PackageReference Include="xunit" Version="2.9.2" />
2929
<PackageReference Include="Xunit.Gherkin.Quick" Version="4.5.0" />

0 commit comments

Comments
 (0)