From 2d06b7af21fb359617c4834de9765ed7fb4b69f6 Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Tue, 25 Aug 2026 16:50:24 -0700 Subject: [PATCH] Add .NET system Nexus serialization context --- nexus/deps/nexus-temporal-types/model.wit | 37 +++++++++++++++-------- nexus/workflow-service.wit | 4 +-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/nexus/deps/nexus-temporal-types/model.wit b/nexus/deps/nexus-temporal-types/model.wit index 91de3e838..9909d34c6 100644 --- a/nexus/deps/nexus-temporal-types/model.wit +++ b/nexus/deps/nexus-temporal-types/model.wit @@ -9,15 +9,28 @@ interface model { /// python="typing.Any" /// typescript="common.Payload" /// dotnet="object?" + /// dotnet-from="ProtoExtensions.FromPayload" /// dotnet-to="ProtoExtensions.ToPayload" /// typescript-import="@temporalio/common" type payload = placeholder; /// @nexus.proto "temporal.api.common.v1.Payloads" /// typescript-import="@temporalio/proto" - /// @nexus.type dotnet="IReadOnlyCollection" dotnet-to="ProtoExtensions.ToPayloads" + /// @nexus.type dotnet="IReadOnlyCollection" dotnet-from="ProtoExtensions.FromPayloads" dotnet-to="ProtoExtensions.ToPayloads" type payloads = list; + /// Temporal failure represented by the target SDK's native exception/error type. + /// The SDK failure converter owns the recursive cause and failure-info structure. + /// @nexus.proto "temporal.api.failure.v1.Failure" typescript-import="@temporalio/proto" + /// @nexus.type + /// python="BaseException" + /// typescript="Error" + /// go="error" + /// dotnet="System.Exception" + /// dotnet-from="ProtoExtensions.FromFailureProto" + /// dotnet-to="ProtoExtensions.ToFailureProto" + type failure = placeholder; + /// Callable result annotation for workflow functions. /// @nexus.type /// python="collections.abc.Awaitable[WorkflowResult]" @@ -50,6 +63,7 @@ interface model { /// python="str" /// typescript="string" /// dotnet="string" + /// dotnet-from="ProtoExtensions.FromWorkflowTypeProto" /// dotnet-to="ProtoExtensions.ToWorkflowTypeProto" type workflow-type = placeholder; @@ -83,6 +97,7 @@ interface model { /// python="temporalio.common.RetryPolicy" /// typescript="common.RetryPolicy" /// dotnet="Temporalio.Common.RetryPolicy" + /// dotnet-from="ProtoExtensions.FromRetryPolicyProto" /// typescript-import="@temporalio/common" type retry-policy = placeholder; @@ -91,11 +106,12 @@ interface model { /// python="str" /// typescript="string" /// dotnet="string" + /// dotnet-from="ProtoExtensions.FromTaskQueueProto" /// dotnet-to="ProtoExtensions.ToTaskQueueProto" type task-queue = placeholder; /// @nexus.proto "temporal.api.common.v1.Memo" typescript-import="@temporalio/proto" - /// @nexus.type python="collections.abc.Mapping[str, typing.Any]" typescript="Record" dotnet="IReadOnlyDictionary" + /// @nexus.type python="collections.abc.Mapping[str, typing.Any]" typescript="Record" dotnet="IReadOnlyDictionary" dotnet-from="ProtoExtensions.FromMemoProto" type memo = placeholder; /// @nexus.proto "temporal.api.common.v1.Header" typescript-import="@temporalio/proto" @@ -114,6 +130,7 @@ interface model { /// python="temporalio.common.TypedSearchAttributes" /// typescript="common.TypedSearchAttributes" /// dotnet="Temporalio.Common.SearchAttributeCollection" + /// dotnet-from="ProtoExtensions.FromSearchAttributesProto" /// typescript-import="@temporalio/common" type search-attributes = placeholder; @@ -122,6 +139,7 @@ interface model { /// python="temporalio.common.Priority" /// typescript="common.Priority" /// dotnet="Temporalio.Common.Priority" + /// dotnet-from="ProtoExtensions.FromPriorityProto" /// typescript-import="@temporalio/common" type priority = placeholder; @@ -130,6 +148,7 @@ interface model { /// python="temporalio.common.VersioningOverride" /// typescript="common.VersioningOverride" /// dotnet="Temporalio.Common.VersioningOverride" + /// dotnet-from="ProtoExtensions.FromVersioningOverrideProto" /// typescript-import="@temporalio/common" type versioning-override = placeholder; @@ -138,6 +157,7 @@ interface model { /// python="datetime.timedelta" /// typescript="common.Duration" /// dotnet="System.TimeSpan" + /// dotnet-from="ProtoExtensions.FromDurationProto" /// typescript-import="@temporalio/common" type duration = placeholder; @@ -147,12 +167,7 @@ interface model { /// typescript="common.WorkflowIdReusePolicy" /// dotnet="Temporalio.Api.Enums.V1.WorkflowIdReusePolicy" /// typescript-import="@temporalio/common" - enum workflow-id-reuse-policy { - allow-duplicate, - allow-duplicate-failed-only, - reject-duplicate, - terminate-if-running, - } + type workflow-id-reuse-policy = placeholder; /// @nexus.proto "temporal.api.enums.v1.WorkflowIdConflictPolicy" typescript-import="@temporalio/proto" /// @nexus.type @@ -160,11 +175,7 @@ interface model { /// typescript="common.WorkflowIdConflictPolicy" /// dotnet="Temporalio.Api.Enums.V1.WorkflowIdConflictPolicy" /// typescript-import="@temporalio/common" - enum workflow-id-conflict-policy { - fail, - use-existing, - terminate-existing, - } + type workflow-id-conflict-policy = placeholder; /// @nexus.proto "temporal.api.sdk.v1.UserMetadata" typescript-import="@temporalio/proto" /// @nexus.flatten-in-api diff --git a/nexus/workflow-service.wit b/nexus/workflow-service.wit index 5ae3814e6..190aae88c 100644 --- a/nexus/workflow-service.wit +++ b/nexus/workflow-service.wit @@ -86,7 +86,7 @@ interface workflow-service { /// @nexus.proto-field "workflow_start_delay" start-delay: option, user-metadata: option, - /// @nexus.source python="workflow_namespace" typescript="workflowNamespace" dotnet="TemporalWorkflowContext.WorkflowNamespace" + /// @nexus.source python="workflow_namespace()" typescript="workflowNamespace()" go="workflow.GetInfo(ctx).Namespace" dotnet="TemporalWorkflowContext.WorkflowNamespace()" namespace: string, /// @nexus.omit control: placeholder, @@ -122,7 +122,7 @@ interface workflow-service { /// dotnet-type="Temporalio.Workflows.ExternalWorkflowHandle" /// dotnet="Temporalio.Workflows.Workflow.GetExternalWorkflowHandle(request.Id, result.RunId)" /// @nexus.operation name="SignalWithStartWorkflowExecution" - /// @nexus.serialization-context python="signal_with_start_workflow_serialization_context" + /// @nexus.serialization-context python="signal_with_start_workflow_serialization_context" dotnet="WorkflowServiceSerializationContexts.SignalWithStartWorkflow" /// @nexus.experimental signal-with-start-workflow: func( request: signal-with-start-workflow-request,